@polymarket/clob-client-v2 0.2.7 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2495 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1000 -0
- package/dist/index.d.ts +1000 -7
- package/dist/index.js +2437 -7
- package/dist/index.js.map +1 -1
- package/package.json +12 -5
- package/dist/client.d.ts +0 -134
- package/dist/client.js +0 -942
- package/dist/client.js.map +0 -1
- package/dist/config.d.ts +0 -14
- package/dist/config.js +0 -32
- package/dist/config.js.map +0 -1
- package/dist/constants.d.ts +0 -6
- package/dist/constants.js +0 -10
- package/dist/constants.js.map +0 -1
- package/dist/endpoints.d.ts +0 -60
- package/dist/endpoints.js +0 -75
- package/dist/endpoints.js.map +0 -1
- package/dist/errors.d.ts +0 -2
- package/dist/errors.js +0 -3
- package/dist/errors.js.map +0 -1
- package/dist/headers/index.d.ts +0 -4
- package/dist/headers/index.js +0 -38
- package/dist/headers/index.js.map +0 -1
- package/dist/http-helpers/index.d.ts +0 -18
- package/dist/http-helpers/index.js +0 -124
- package/dist/http-helpers/index.js.map +0 -1
- package/dist/order-builder/helpers/buildMarketOrderCreationArgs.d.ts +0 -6
- package/dist/order-builder/helpers/buildMarketOrderCreationArgs.js +0 -25
- package/dist/order-builder/helpers/buildMarketOrderCreationArgs.js.map +0 -1
- package/dist/order-builder/helpers/buildOrder.d.ts +0 -14
- package/dist/order-builder/helpers/buildOrder.js +0 -29
- package/dist/order-builder/helpers/buildOrder.js.map +0 -1
- package/dist/order-builder/helpers/buildOrderCreationArgs.d.ts +0 -6
- package/dist/order-builder/helpers/buildOrderCreationArgs.js +0 -26
- package/dist/order-builder/helpers/buildOrderCreationArgs.js.map +0 -1
- package/dist/order-builder/helpers/calculateBuyMarketPrice.d.ts +0 -8
- package/dist/order-builder/helpers/calculateBuyMarketPrice.js +0 -34
- package/dist/order-builder/helpers/calculateBuyMarketPrice.js.map +0 -1
- package/dist/order-builder/helpers/calculateSellMarketPrice.d.ts +0 -8
- package/dist/order-builder/helpers/calculateSellMarketPrice.js +0 -34
- package/dist/order-builder/helpers/calculateSellMarketPrice.js.map +0 -1
- package/dist/order-builder/helpers/createMarketOrder.d.ts +0 -5
- package/dist/order-builder/helpers/createMarketOrder.js +0 -36
- package/dist/order-builder/helpers/createMarketOrder.js.map +0 -1
- package/dist/order-builder/helpers/createOrder.d.ts +0 -5
- package/dist/order-builder/helpers/createOrder.js +0 -36
- package/dist/order-builder/helpers/createOrder.js.map +0 -1
- package/dist/order-builder/helpers/getMarketOrderRawAmounts.d.ts +0 -6
- package/dist/order-builder/helpers/getMarketOrderRawAmounts.js +0 -37
- package/dist/order-builder/helpers/getMarketOrderRawAmounts.js.map +0 -1
- package/dist/order-builder/helpers/getOrderRawAmounts.d.ts +0 -6
- package/dist/order-builder/helpers/getOrderRawAmounts.js +0 -37
- package/dist/order-builder/helpers/getOrderRawAmounts.js.map +0 -1
- package/dist/order-builder/helpers/index.d.ts +0 -10
- package/dist/order-builder/helpers/index.js +0 -11
- package/dist/order-builder/helpers/index.js.map +0 -1
- package/dist/order-builder/helpers/roundingConfig.d.ts +0 -2
- package/dist/order-builder/helpers/roundingConfig.js +0 -23
- package/dist/order-builder/helpers/roundingConfig.js.map +0 -1
- package/dist/order-builder/index.d.ts +0 -1
- package/dist/order-builder/index.js +0 -2
- package/dist/order-builder/index.js.map +0 -1
- package/dist/order-builder/orderBuilder.d.ts +0 -28
- package/dist/order-builder/orderBuilder.js +0 -52
- package/dist/order-builder/orderBuilder.js.map +0 -1
- package/dist/order-utils/abi/ExchangeV1.d.ts +0 -1444
- package/dist/order-utils/abi/ExchangeV1.js +0 -1853
- package/dist/order-utils/abi/ExchangeV1.js.map +0 -1
- package/dist/order-utils/abi/ExchangeV2.d.ts +0 -1259
- package/dist/order-utils/abi/ExchangeV2.js +0 -1614
- package/dist/order-utils/abi/ExchangeV2.js.map +0 -1
- package/dist/order-utils/exchangeOrderBuilderV1.d.ts +0 -42
- package/dist/order-utils/exchangeOrderBuilderV1.js +0 -148
- package/dist/order-utils/exchangeOrderBuilderV1.js.map +0 -1
- package/dist/order-utils/exchangeOrderBuilderV2.d.ts +0 -42
- package/dist/order-utils/exchangeOrderBuilderV2.js +0 -119
- package/dist/order-utils/exchangeOrderBuilderV2.js.map +0 -1
- package/dist/order-utils/index.d.ts +0 -2711
- package/dist/order-utils/index.js +0 -13
- package/dist/order-utils/index.js.map +0 -1
- package/dist/order-utils/model/abi.d.ts +0 -21
- package/dist/order-utils/model/abi.js +0 -2
- package/dist/order-utils/model/abi.js.map +0 -1
- package/dist/order-utils/model/ctfExchangeV1TypedData.d.ts +0 -6
- package/dist/order-utils/model/ctfExchangeV1TypedData.js +0 -17
- package/dist/order-utils/model/ctfExchangeV1TypedData.js.map +0 -1
- package/dist/order-utils/model/ctfExchangeV2TypedData.d.ts +0 -6
- package/dist/order-utils/model/ctfExchangeV2TypedData.js +0 -16
- package/dist/order-utils/model/ctfExchangeV2TypedData.js.map +0 -1
- package/dist/order-utils/model/eip712.d.ts +0 -29
- package/dist/order-utils/model/eip712.js +0 -7
- package/dist/order-utils/model/eip712.js.map +0 -1
- package/dist/order-utils/model/order.d.ts +0 -2
- package/dist/order-utils/model/order.js +0 -2
- package/dist/order-utils/model/order.js.map +0 -1
- package/dist/order-utils/model/orderDataV1.d.ts +0 -111
- package/dist/order-utils/model/orderDataV1.js +0 -2
- package/dist/order-utils/model/orderDataV1.js.map +0 -1
- package/dist/order-utils/model/orderDataV2.d.ts +0 -110
- package/dist/order-utils/model/orderDataV2.js +0 -2
- package/dist/order-utils/model/orderDataV2.js.map +0 -1
- package/dist/order-utils/model/side.d.ts +0 -4
- package/dist/order-utils/model/side.js +0 -6
- package/dist/order-utils/model/side.js.map +0 -1
- package/dist/order-utils/model/signatureTypeV1.d.ts +0 -14
- package/dist/order-utils/model/signatureTypeV1.js +0 -16
- package/dist/order-utils/model/signatureTypeV1.js.map +0 -1
- package/dist/order-utils/model/signatureTypeV2.d.ts +0 -18
- package/dist/order-utils/model/signatureTypeV2.js +0 -20
- package/dist/order-utils/model/signatureTypeV2.js.map +0 -1
- package/dist/order-utils/utils.d.ts +0 -1
- package/dist/order-utils/utils.js +0 -4
- package/dist/order-utils/utils.js.map +0 -1
- package/dist/signing/constants.d.ts +0 -14
- package/dist/signing/constants.js +0 -16
- package/dist/signing/constants.js.map +0 -1
- package/dist/signing/eip712.d.ts +0 -9
- package/dist/signing/eip712.js +0 -40
- package/dist/signing/eip712.js.map +0 -1
- package/dist/signing/hmac.d.ts +0 -9
- package/dist/signing/hmac.js +0 -27
- package/dist/signing/hmac.js.map +0 -1
- package/dist/signing/index.d.ts +0 -3
- package/dist/signing/index.js +0 -4
- package/dist/signing/index.js.map +0 -1
- package/dist/signing/signer.d.ts +0 -22
- package/dist/signing/signer.js +0 -50
- package/dist/signing/signer.js.map +0 -1
- package/dist/types/clob.d.ts +0 -395
- package/dist/types/clob.js +0 -28
- package/dist/types/clob.js.map +0 -1
- package/dist/types/index.d.ts +0 -4
- package/dist/types/index.js +0 -5
- package/dist/types/index.js.map +0 -1
- package/dist/types/ordersV1.d.ts +0 -108
- package/dist/types/ordersV1.js +0 -24
- package/dist/types/ordersV1.js.map +0 -1
- package/dist/types/ordersV2.d.ts +0 -99
- package/dist/types/ordersV2.js +0 -25
- package/dist/types/ordersV2.js.map +0 -1
- package/dist/types/unifiedOrder.d.ts +0 -38
- package/dist/types/unifiedOrder.js +0 -9
- package/dist/types/unifiedOrder.js.map +0 -1
- package/dist/utilities.d.ts +0 -13
- package/dist/utilities.js +0 -47
- package/dist/utilities.js.map +0 -1
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2495 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/index.ts
|
|
31
|
+
var index_exports = {};
|
|
32
|
+
__export(index_exports, {
|
|
33
|
+
ApiError: () => ApiError,
|
|
34
|
+
AssetType: () => AssetType,
|
|
35
|
+
COLLATERAL_TOKEN_DECIMALS: () => COLLATERAL_TOKEN_DECIMALS,
|
|
36
|
+
CONDITIONAL_TOKEN_DECIMALS: () => CONDITIONAL_TOKEN_DECIMALS,
|
|
37
|
+
Chain: () => Chain,
|
|
38
|
+
ClobClient: () => ClobClient,
|
|
39
|
+
L1_AUTH_UNAVAILABLE_ERROR: () => L1_AUTH_UNAVAILABLE_ERROR,
|
|
40
|
+
L2_AUTH_NOT_AVAILABLE: () => L2_AUTH_NOT_AVAILABLE,
|
|
41
|
+
OrderBuilder: () => OrderBuilder,
|
|
42
|
+
OrderType: () => OrderType,
|
|
43
|
+
PriceHistoryInterval: () => PriceHistoryInterval,
|
|
44
|
+
Side: () => Side,
|
|
45
|
+
SignatureTypeV1: () => SignatureTypeV1,
|
|
46
|
+
SignatureTypeV2: () => SignatureTypeV2,
|
|
47
|
+
adjustBuyAmountForFees: () => adjustBuyAmountForFees,
|
|
48
|
+
createL1Headers: () => createL1Headers,
|
|
49
|
+
createL2Headers: () => createL2Headers,
|
|
50
|
+
getContractConfig: () => getContractConfig,
|
|
51
|
+
isV2Order: () => isV2Order,
|
|
52
|
+
orderToJsonV1: () => orderToJsonV1,
|
|
53
|
+
orderToJsonV2: () => orderToJsonV2
|
|
54
|
+
});
|
|
55
|
+
module.exports = __toCommonJS(index_exports);
|
|
56
|
+
|
|
57
|
+
// src/constants.ts
|
|
58
|
+
var INITIAL_CURSOR = "MA==";
|
|
59
|
+
var END_CURSOR = "LTE=";
|
|
60
|
+
var bytes32Zero = "0x0000000000000000000000000000000000000000000000000000000000000000";
|
|
61
|
+
var ORDER_VERSION_MISMATCH_ERROR = "order_version_mismatch";
|
|
62
|
+
var BUILDER_FEES_BPS = 1e4;
|
|
63
|
+
|
|
64
|
+
// src/endpoints.ts
|
|
65
|
+
var OK = "/ok";
|
|
66
|
+
var HEARTBEAT = "/v1/heartbeats";
|
|
67
|
+
var TIME = "/time";
|
|
68
|
+
var CREATE_API_KEY = "/auth/api-key";
|
|
69
|
+
var GET_API_KEYS = "/auth/api-keys";
|
|
70
|
+
var DELETE_API_KEY = "/auth/api-key";
|
|
71
|
+
var DERIVE_API_KEY = "/auth/derive-api-key";
|
|
72
|
+
var CLOSED_ONLY = "/auth/ban-status/closed-only";
|
|
73
|
+
var GET_SAMPLING_SIMPLIFIED_MARKETS = "/sampling-simplified-markets";
|
|
74
|
+
var GET_SAMPLING_MARKETS = "/sampling-markets";
|
|
75
|
+
var GET_SIMPLIFIED_MARKETS = "/simplified-markets";
|
|
76
|
+
var GET_MARKETS = "/markets";
|
|
77
|
+
var GET_MARKET = "/markets/";
|
|
78
|
+
var GET_MARKET_BY_TOKEN = "/markets-by-token/";
|
|
79
|
+
var GET_CLOB_MARKET = "/clob-markets/";
|
|
80
|
+
var GET_ORDER_BOOK = "/book";
|
|
81
|
+
var GET_ORDER_BOOKS = "/books";
|
|
82
|
+
var GET_MIDPOINT = "/midpoint";
|
|
83
|
+
var GET_MIDPOINTS = "/midpoints";
|
|
84
|
+
var GET_PRICE = "/price";
|
|
85
|
+
var GET_PRICES = "/prices";
|
|
86
|
+
var GET_SPREAD = "/spread";
|
|
87
|
+
var GET_SPREADS = "/spreads";
|
|
88
|
+
var GET_LAST_TRADE_PRICE = "/last-trade-price";
|
|
89
|
+
var GET_LAST_TRADES_PRICES = "/last-trades-prices";
|
|
90
|
+
var GET_TICK_SIZE = "/tick-size";
|
|
91
|
+
var GET_NEG_RISK = "/neg-risk";
|
|
92
|
+
var GET_FEE_RATE = "/fee-rate";
|
|
93
|
+
var POST_ORDER = "/order";
|
|
94
|
+
var POST_ORDERS = "/orders";
|
|
95
|
+
var CANCEL_ORDER = "/order";
|
|
96
|
+
var CANCEL_ORDERS = "/orders";
|
|
97
|
+
var GET_ORDER = "/data/order/";
|
|
98
|
+
var CANCEL_ALL = "/cancel-all";
|
|
99
|
+
var CANCEL_MARKET_ORDERS = "/cancel-market-orders";
|
|
100
|
+
var GET_OPEN_ORDERS = "/data/orders";
|
|
101
|
+
var GET_PRE_MIGRATION_ORDERS = "/data/pre-migration-orders";
|
|
102
|
+
var GET_TRADES = "/data/trades";
|
|
103
|
+
var IS_ORDER_SCORING = "/order-scoring";
|
|
104
|
+
var ARE_ORDERS_SCORING = "/orders-scoring";
|
|
105
|
+
var GET_PRICES_HISTORY = "/prices-history";
|
|
106
|
+
var GET_NOTIFICATIONS = "/notifications";
|
|
107
|
+
var DROP_NOTIFICATIONS = "/notifications";
|
|
108
|
+
var GET_BALANCE_ALLOWANCE = "/balance-allowance";
|
|
109
|
+
var UPDATE_BALANCE_ALLOWANCE = "/balance-allowance/update";
|
|
110
|
+
var GET_EARNINGS_FOR_USER_FOR_DAY = "/rewards/user";
|
|
111
|
+
var GET_TOTAL_EARNINGS_FOR_USER_FOR_DAY = "/rewards/user/total";
|
|
112
|
+
var GET_LIQUIDITY_REWARD_PERCENTAGES = "/rewards/user/percentages";
|
|
113
|
+
var GET_REWARDS_MARKETS_CURRENT = "/rewards/markets/current";
|
|
114
|
+
var GET_REWARDS_MARKETS = "/rewards/markets/";
|
|
115
|
+
var GET_REWARDS_EARNINGS_PERCENTAGES = "/rewards/user/markets";
|
|
116
|
+
var CREATE_READONLY_API_KEY = "/auth/readonly-api-key";
|
|
117
|
+
var GET_READONLY_API_KEYS = "/auth/readonly-api-keys";
|
|
118
|
+
var DELETE_READONLY_API_KEY = "/auth/readonly-api-key";
|
|
119
|
+
var CREATE_BUILDER_API_KEY = "/auth/builder-api-key";
|
|
120
|
+
var GET_BUILDER_API_KEYS = "/auth/builder-api-key";
|
|
121
|
+
var REVOKE_BUILDER_API_KEY = "/auth/builder-api-key";
|
|
122
|
+
var GET_MARKET_TRADES_EVENTS = "/markets/live-activity/";
|
|
123
|
+
var GET_BUILDER_TRADES = "/builder/trades";
|
|
124
|
+
var GET_BUILDER_FEES = "/fees/builder-fees/";
|
|
125
|
+
|
|
126
|
+
// src/errors.ts
|
|
127
|
+
var L1_AUTH_UNAVAILABLE_ERROR = new Error(
|
|
128
|
+
"Signer is needed to interact with this endpoint!"
|
|
129
|
+
);
|
|
130
|
+
var L2_AUTH_NOT_AVAILABLE = new Error(
|
|
131
|
+
"API Credentials are needed to interact with this endpoint!"
|
|
132
|
+
);
|
|
133
|
+
var ApiError = class extends Error {
|
|
134
|
+
status;
|
|
135
|
+
data;
|
|
136
|
+
constructor(message, status, data) {
|
|
137
|
+
super(message);
|
|
138
|
+
this.name = "ApiError";
|
|
139
|
+
this.status = status;
|
|
140
|
+
this.data = data;
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// src/signing/constants.ts
|
|
145
|
+
var MSG_TO_SIGN = "This message attests that I control the given wallet";
|
|
146
|
+
|
|
147
|
+
// src/signing/signer.ts
|
|
148
|
+
var isEthersTypedDataSigner = (signer) => (
|
|
149
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
150
|
+
typeof signer._signTypedData === "function"
|
|
151
|
+
);
|
|
152
|
+
var isWalletClientSigner = (signer) => typeof signer.signTypedData === "function";
|
|
153
|
+
var getWalletClientAddress = async (walletClient) => {
|
|
154
|
+
const accountAddress = walletClient.account?.address;
|
|
155
|
+
if (typeof accountAddress === "string" && accountAddress.length > 0) {
|
|
156
|
+
return accountAddress;
|
|
157
|
+
}
|
|
158
|
+
if (typeof walletClient.requestAddresses === "function") {
|
|
159
|
+
const [address] = await walletClient.requestAddresses();
|
|
160
|
+
if (typeof address === "string" && address.length > 0) {
|
|
161
|
+
return address;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (typeof walletClient.getAddresses === "function") {
|
|
165
|
+
const [address] = await walletClient.getAddresses();
|
|
166
|
+
if (typeof address === "string" && address.length > 0) {
|
|
167
|
+
return address;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
throw new Error("wallet client is missing account address");
|
|
171
|
+
};
|
|
172
|
+
var getSignerAddress = async (signer) => {
|
|
173
|
+
if (isEthersTypedDataSigner(signer)) {
|
|
174
|
+
return signer.getAddress();
|
|
175
|
+
}
|
|
176
|
+
if (isWalletClientSigner(signer)) {
|
|
177
|
+
return getWalletClientAddress(signer);
|
|
178
|
+
}
|
|
179
|
+
throw new Error("unsupported signer type");
|
|
180
|
+
};
|
|
181
|
+
var signTypedDataWithSigner = async ({
|
|
182
|
+
signer,
|
|
183
|
+
domain,
|
|
184
|
+
types,
|
|
185
|
+
value,
|
|
186
|
+
primaryType
|
|
187
|
+
}) => {
|
|
188
|
+
if (isEthersTypedDataSigner(signer)) {
|
|
189
|
+
return signer._signTypedData(domain, types, value);
|
|
190
|
+
}
|
|
191
|
+
if (isWalletClientSigner(signer)) {
|
|
192
|
+
const account = signer.account ?? await getWalletClientAddress(signer);
|
|
193
|
+
return signer.signTypedData({
|
|
194
|
+
account,
|
|
195
|
+
domain,
|
|
196
|
+
types,
|
|
197
|
+
primaryType,
|
|
198
|
+
message: value
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
throw new Error("unsupported signer type");
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
// src/signing/eip712.ts
|
|
205
|
+
var buildClobEip712Signature = async (signer, chainId, timestamp, nonce) => {
|
|
206
|
+
const address = await getSignerAddress(signer);
|
|
207
|
+
const ts = timestamp.toString();
|
|
208
|
+
const domain = {
|
|
209
|
+
name: "ClobAuthDomain",
|
|
210
|
+
version: "1",
|
|
211
|
+
chainId
|
|
212
|
+
};
|
|
213
|
+
const types = {
|
|
214
|
+
ClobAuth: [
|
|
215
|
+
{ name: "address", type: "address" },
|
|
216
|
+
{ name: "timestamp", type: "string" },
|
|
217
|
+
{ name: "nonce", type: "uint256" },
|
|
218
|
+
{ name: "message", type: "string" }
|
|
219
|
+
]
|
|
220
|
+
};
|
|
221
|
+
const value = {
|
|
222
|
+
address,
|
|
223
|
+
timestamp: ts,
|
|
224
|
+
nonce,
|
|
225
|
+
message: MSG_TO_SIGN
|
|
226
|
+
};
|
|
227
|
+
const sig = await signTypedDataWithSigner({
|
|
228
|
+
signer,
|
|
229
|
+
domain,
|
|
230
|
+
types,
|
|
231
|
+
value,
|
|
232
|
+
primaryType: "ClobAuth"
|
|
233
|
+
});
|
|
234
|
+
return sig;
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// src/signing/hmac.ts
|
|
238
|
+
var import_node_crypto = __toESM(require("crypto"), 1);
|
|
239
|
+
function replaceAll(s, search, replace) {
|
|
240
|
+
return s.split(search).join(replace);
|
|
241
|
+
}
|
|
242
|
+
var buildPolyHmacSignature = (secret, timestamp, method, requestPath, body) => {
|
|
243
|
+
let message = timestamp + method + requestPath;
|
|
244
|
+
if (body !== void 0) {
|
|
245
|
+
message += body;
|
|
246
|
+
}
|
|
247
|
+
const base64Secret = Buffer.from(secret, "base64");
|
|
248
|
+
const hmac = import_node_crypto.default.createHmac("sha256", base64Secret);
|
|
249
|
+
const sig = hmac.update(message).digest("base64");
|
|
250
|
+
const sigUrlSafe = replaceAll(replaceAll(sig, "+", "-"), "/", "_");
|
|
251
|
+
return sigUrlSafe;
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
// src/headers/index.ts
|
|
255
|
+
var createL1Headers = async (signer, chainId, nonce, timestamp) => {
|
|
256
|
+
let ts = Math.floor(Date.now() / 1e3);
|
|
257
|
+
if (timestamp !== void 0) {
|
|
258
|
+
ts = timestamp;
|
|
259
|
+
}
|
|
260
|
+
let n = 0;
|
|
261
|
+
if (nonce !== void 0) {
|
|
262
|
+
n = nonce;
|
|
263
|
+
}
|
|
264
|
+
const sig = await buildClobEip712Signature(signer, chainId, ts, n);
|
|
265
|
+
const address = await getSignerAddress(signer);
|
|
266
|
+
const headers = {
|
|
267
|
+
POLY_ADDRESS: address,
|
|
268
|
+
POLY_SIGNATURE: sig,
|
|
269
|
+
POLY_TIMESTAMP: `${ts}`,
|
|
270
|
+
POLY_NONCE: `${n}`
|
|
271
|
+
};
|
|
272
|
+
return headers;
|
|
273
|
+
};
|
|
274
|
+
var createL2Headers = async (signer, creds, l2HeaderArgs, timestamp) => {
|
|
275
|
+
let ts = Math.floor(Date.now() / 1e3);
|
|
276
|
+
if (timestamp !== void 0) {
|
|
277
|
+
ts = timestamp;
|
|
278
|
+
}
|
|
279
|
+
const address = await getSignerAddress(signer);
|
|
280
|
+
const sig = buildPolyHmacSignature(
|
|
281
|
+
creds.secret,
|
|
282
|
+
ts,
|
|
283
|
+
l2HeaderArgs.method,
|
|
284
|
+
l2HeaderArgs.requestPath,
|
|
285
|
+
l2HeaderArgs.body
|
|
286
|
+
);
|
|
287
|
+
const headers = {
|
|
288
|
+
POLY_ADDRESS: address,
|
|
289
|
+
POLY_SIGNATURE: sig,
|
|
290
|
+
POLY_TIMESTAMP: `${ts}`,
|
|
291
|
+
POLY_API_KEY: creds.key,
|
|
292
|
+
POLY_PASSPHRASE: creds.passphrase
|
|
293
|
+
};
|
|
294
|
+
return headers;
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
// src/http-helpers/index.ts
|
|
298
|
+
var import_axios = __toESM(require("axios"), 1);
|
|
299
|
+
var import_browser_or_node = require("browser-or-node");
|
|
300
|
+
var GET = "GET";
|
|
301
|
+
var POST = "POST";
|
|
302
|
+
var DELETE = "DELETE";
|
|
303
|
+
var overloadHeaders = (method, headers = {}) => {
|
|
304
|
+
if (import_browser_or_node.isBrowser) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
headers["User-Agent"] = `@polymarket/clob-client`;
|
|
308
|
+
headers.Accept = "*/*";
|
|
309
|
+
headers.Connection = "keep-alive";
|
|
310
|
+
headers["Content-Type"] = "application/json";
|
|
311
|
+
if (method === GET) {
|
|
312
|
+
headers["Accept-Encoding"] = "gzip";
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
var request = async (endpoint, method, headers, data, params) => {
|
|
316
|
+
overloadHeaders(method, headers);
|
|
317
|
+
return await (0, import_axios.default)({ method, url: endpoint, headers, data, params });
|
|
318
|
+
};
|
|
319
|
+
var sleep = (ms) => new Promise((res) => setTimeout(res, ms));
|
|
320
|
+
var post = async (endpoint, options, retryOnError = false) => {
|
|
321
|
+
try {
|
|
322
|
+
const resp = await request(
|
|
323
|
+
endpoint,
|
|
324
|
+
POST,
|
|
325
|
+
options?.headers,
|
|
326
|
+
options?.data,
|
|
327
|
+
options?.params
|
|
328
|
+
);
|
|
329
|
+
return resp.data;
|
|
330
|
+
} catch (err) {
|
|
331
|
+
if (retryOnError && isTransientAxiosError(err)) {
|
|
332
|
+
console.log("[CLOB Client-v2] transient error, retrying once after 30 ms");
|
|
333
|
+
await sleep(30);
|
|
334
|
+
try {
|
|
335
|
+
const resp = await request(
|
|
336
|
+
endpoint,
|
|
337
|
+
POST,
|
|
338
|
+
options?.headers,
|
|
339
|
+
options?.data,
|
|
340
|
+
options?.params
|
|
341
|
+
);
|
|
342
|
+
return resp.data;
|
|
343
|
+
} catch (retryErr) {
|
|
344
|
+
return errorHandling(retryErr);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return errorHandling(err);
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
var get = async (endpoint, options) => {
|
|
351
|
+
try {
|
|
352
|
+
const resp = await request(endpoint, GET, options?.headers, options?.data, options?.params);
|
|
353
|
+
return resp.data;
|
|
354
|
+
} catch (err) {
|
|
355
|
+
return errorHandling(err);
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
var del = async (endpoint, options) => {
|
|
359
|
+
try {
|
|
360
|
+
const resp = await request(
|
|
361
|
+
endpoint,
|
|
362
|
+
DELETE,
|
|
363
|
+
options?.headers,
|
|
364
|
+
options?.data,
|
|
365
|
+
options?.params
|
|
366
|
+
);
|
|
367
|
+
return resp.data;
|
|
368
|
+
} catch (err) {
|
|
369
|
+
return errorHandling(err);
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
var errorHandling = (err) => {
|
|
373
|
+
if (import_axios.default.isAxiosError(err)) {
|
|
374
|
+
if (err.response) {
|
|
375
|
+
console.error(
|
|
376
|
+
"[CLOB Client] request error",
|
|
377
|
+
JSON.stringify({
|
|
378
|
+
status: err.response?.status,
|
|
379
|
+
statusText: err.response?.statusText,
|
|
380
|
+
data: err.response?.data,
|
|
381
|
+
config: err.response?.config
|
|
382
|
+
})
|
|
383
|
+
);
|
|
384
|
+
if (err.response?.data) {
|
|
385
|
+
if (typeof err.response?.data === "string" || err.response?.data instanceof String) {
|
|
386
|
+
return { error: err.response?.data, status: err.response?.status };
|
|
387
|
+
}
|
|
388
|
+
if (!Object.prototype.hasOwnProperty.call(err.response?.data, "error")) {
|
|
389
|
+
return { error: err.response?.data, status: err.response?.status };
|
|
390
|
+
}
|
|
391
|
+
return { ...err.response?.data, status: err.response?.status };
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
if (err.message) {
|
|
395
|
+
console.error(
|
|
396
|
+
"[CLOB Client] request error",
|
|
397
|
+
JSON.stringify({
|
|
398
|
+
error: err.message
|
|
399
|
+
})
|
|
400
|
+
);
|
|
401
|
+
return { error: err.message };
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
console.error("[CLOB Client] request error", err);
|
|
405
|
+
return { error: err };
|
|
406
|
+
};
|
|
407
|
+
var isTransientAxiosError = (err) => {
|
|
408
|
+
if (!import_axios.default.isAxiosError(err)) return false;
|
|
409
|
+
if (!err.response) return true;
|
|
410
|
+
const status = err.response.status ?? 0;
|
|
411
|
+
if (status >= 500 && status < 600) return true;
|
|
412
|
+
const code = (err.code ?? "").toString();
|
|
413
|
+
return ["ECONNABORTED", "ENETUNREACH", "EAI_AGAIN", "ETIMEDOUT"].includes(code);
|
|
414
|
+
};
|
|
415
|
+
var parseDropNotificationParams = (dropNotificationParams) => {
|
|
416
|
+
const params = {};
|
|
417
|
+
if (dropNotificationParams !== void 0) {
|
|
418
|
+
if (dropNotificationParams.ids !== void 0) {
|
|
419
|
+
params.ids = dropNotificationParams?.ids.join(",");
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return params;
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
// src/order-builder/helpers/buildMarketOrderCreationArgs.ts
|
|
426
|
+
var import_viem = require("viem");
|
|
427
|
+
|
|
428
|
+
// src/config.ts
|
|
429
|
+
var AMOY_CONTRACTS = {
|
|
430
|
+
exchange: "0xdFE02Eb6733538f8Ea35D585af8DE5958AD99E40",
|
|
431
|
+
negRiskAdapter: "0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296",
|
|
432
|
+
negRiskExchange: "0xC5d563A36AE78145C45a50134d48A1215220f80a",
|
|
433
|
+
collateral: "0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB",
|
|
434
|
+
conditionalTokens: "0x69308FB512518e39F9b16112fA8d994F4e2Bf8bB",
|
|
435
|
+
exchangeV2: "0xE111180000d2663C0091e4f400237545B87B996B",
|
|
436
|
+
negRiskExchangeV2: "0xe2222d279d744050d28e00520010520000310F59"
|
|
437
|
+
};
|
|
438
|
+
var MATIC_CONTRACTS = {
|
|
439
|
+
exchange: "0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E",
|
|
440
|
+
negRiskAdapter: "0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296",
|
|
441
|
+
negRiskExchange: "0xC5d563A36AE78145C45a50134d48A1215220f80a",
|
|
442
|
+
collateral: "0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB",
|
|
443
|
+
conditionalTokens: "0x4D97DCd97eC945f40cF65F87097ACe5EA0476045",
|
|
444
|
+
exchangeV2: "0xE111180000d2663C0091e4f400237545B87B996B",
|
|
445
|
+
negRiskExchangeV2: "0xe2222d279d744050d28e00520010520000310F59"
|
|
446
|
+
};
|
|
447
|
+
var COLLATERAL_TOKEN_DECIMALS = 6;
|
|
448
|
+
var CONDITIONAL_TOKEN_DECIMALS = 6;
|
|
449
|
+
var getContractConfig = (chainID) => {
|
|
450
|
+
switch (chainID) {
|
|
451
|
+
case 137:
|
|
452
|
+
return MATIC_CONTRACTS;
|
|
453
|
+
case 80002:
|
|
454
|
+
return AMOY_CONTRACTS;
|
|
455
|
+
default:
|
|
456
|
+
throw new Error("Invalid network");
|
|
457
|
+
}
|
|
458
|
+
};
|
|
459
|
+
|
|
460
|
+
// src/order-builder/helpers/buildMarketOrderCreationArgs.ts
|
|
461
|
+
async function buildMarketOrderCreationArgs(signer, maker, signatureType, userMarketOrder, roundConfig, version = 2) {
|
|
462
|
+
const { side, rawMakerAmt, rawTakerAmt } = getMarketOrderRawAmounts(
|
|
463
|
+
userMarketOrder.side,
|
|
464
|
+
userMarketOrder.amount,
|
|
465
|
+
userMarketOrder.price || 1,
|
|
466
|
+
roundConfig
|
|
467
|
+
);
|
|
468
|
+
const makerAmount = (0, import_viem.parseUnits)(rawMakerAmt.toString(), COLLATERAL_TOKEN_DECIMALS).toString();
|
|
469
|
+
const takerAmount = (0, import_viem.parseUnits)(rawTakerAmt.toString(), COLLATERAL_TOKEN_DECIMALS).toString();
|
|
470
|
+
if (version === 1) {
|
|
471
|
+
const v1Order = userMarketOrder;
|
|
472
|
+
return {
|
|
473
|
+
maker,
|
|
474
|
+
taker: v1Order.taker ?? import_viem.zeroAddress,
|
|
475
|
+
tokenId: userMarketOrder.tokenID,
|
|
476
|
+
makerAmount,
|
|
477
|
+
takerAmount,
|
|
478
|
+
side,
|
|
479
|
+
signer,
|
|
480
|
+
signatureType,
|
|
481
|
+
feeRateBps: v1Order.feeRateBps?.toString() ?? "0",
|
|
482
|
+
nonce: v1Order.nonce?.toString() ?? "0"
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
return {
|
|
486
|
+
maker,
|
|
487
|
+
tokenId: userMarketOrder.tokenID,
|
|
488
|
+
makerAmount,
|
|
489
|
+
takerAmount,
|
|
490
|
+
side,
|
|
491
|
+
signer,
|
|
492
|
+
signatureType,
|
|
493
|
+
timestamp: Date.now().toString(),
|
|
494
|
+
metadata: "metadata" in userMarketOrder ? userMarketOrder.metadata ?? bytes32Zero : bytes32Zero,
|
|
495
|
+
builder: userMarketOrder.builderCode ?? bytes32Zero
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
// src/order-utils/exchangeOrderBuilderV1.ts
|
|
500
|
+
var import_viem2 = require("viem");
|
|
501
|
+
|
|
502
|
+
// src/order-utils/model/ctfExchangeV1TypedData.ts
|
|
503
|
+
var CTF_EXCHANGE_V1_DOMAIN_NAME = "Polymarket CTF Exchange";
|
|
504
|
+
var CTF_EXCHANGE_V1_DOMAIN_VERSION = "1";
|
|
505
|
+
var CTF_EXCHANGE_V1_ORDER_STRUCT = [
|
|
506
|
+
{ name: "salt", type: "uint256" },
|
|
507
|
+
{ name: "maker", type: "address" },
|
|
508
|
+
{ name: "signer", type: "address" },
|
|
509
|
+
{ name: "taker", type: "address" },
|
|
510
|
+
{ name: "tokenId", type: "uint256" },
|
|
511
|
+
{ name: "makerAmount", type: "uint256" },
|
|
512
|
+
{ name: "takerAmount", type: "uint256" },
|
|
513
|
+
{ name: "expiration", type: "uint256" },
|
|
514
|
+
{ name: "nonce", type: "uint256" },
|
|
515
|
+
{ name: "feeRateBps", type: "uint256" },
|
|
516
|
+
{ name: "side", type: "uint8" },
|
|
517
|
+
{ name: "signatureType", type: "uint8" }
|
|
518
|
+
];
|
|
519
|
+
|
|
520
|
+
// src/order-utils/model/eip712.ts
|
|
521
|
+
var EIP712_DOMAIN = [
|
|
522
|
+
{ name: "name", type: "string" },
|
|
523
|
+
{ name: "version", type: "string" },
|
|
524
|
+
{ name: "chainId", type: "uint256" },
|
|
525
|
+
{ name: "verifyingContract", type: "address" }
|
|
526
|
+
];
|
|
527
|
+
|
|
528
|
+
// src/order-utils/model/signatureTypeV1.ts
|
|
529
|
+
var SignatureTypeV1 = /* @__PURE__ */ ((SignatureTypeV12) => {
|
|
530
|
+
SignatureTypeV12[SignatureTypeV12["EOA"] = 0] = "EOA";
|
|
531
|
+
SignatureTypeV12[SignatureTypeV12["POLY_PROXY"] = 1] = "POLY_PROXY";
|
|
532
|
+
SignatureTypeV12[SignatureTypeV12["POLY_GNOSIS_SAFE"] = 2] = "POLY_GNOSIS_SAFE";
|
|
533
|
+
return SignatureTypeV12;
|
|
534
|
+
})(SignatureTypeV1 || {});
|
|
535
|
+
|
|
536
|
+
// src/order-utils/utils.ts
|
|
537
|
+
function generateOrderSalt() {
|
|
538
|
+
return `${Math.round(Math.random() * Date.now())}`;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// src/order-utils/exchangeOrderBuilderV1.ts
|
|
542
|
+
var ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
543
|
+
var ExchangeOrderBuilderV1 = class {
|
|
544
|
+
constructor(contractAddress, chainId, signer, generateSalt = generateOrderSalt) {
|
|
545
|
+
this.contractAddress = contractAddress;
|
|
546
|
+
this.chainId = chainId;
|
|
547
|
+
this.signer = signer;
|
|
548
|
+
this.generateSalt = generateSalt;
|
|
549
|
+
}
|
|
550
|
+
contractAddress;
|
|
551
|
+
chainId;
|
|
552
|
+
signer;
|
|
553
|
+
generateSalt;
|
|
554
|
+
/**
|
|
555
|
+
* build an order object including the signature.
|
|
556
|
+
* @param orderData
|
|
557
|
+
* @returns a SignedOrder object (order + signature)
|
|
558
|
+
*/
|
|
559
|
+
async buildSignedOrder(orderData) {
|
|
560
|
+
const order = await this.buildOrder(orderData);
|
|
561
|
+
const orderTypedData = this.buildOrderTypedData(order);
|
|
562
|
+
const orderSignature = await this.buildOrderSignature(orderTypedData);
|
|
563
|
+
return {
|
|
564
|
+
...order,
|
|
565
|
+
signature: orderSignature
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* Creates an Order object from order data.
|
|
570
|
+
* @param OrderData
|
|
571
|
+
* @returns a Order object (not signed)
|
|
572
|
+
*/
|
|
573
|
+
async buildOrder({
|
|
574
|
+
maker,
|
|
575
|
+
taker,
|
|
576
|
+
tokenId,
|
|
577
|
+
makerAmount,
|
|
578
|
+
takerAmount,
|
|
579
|
+
side,
|
|
580
|
+
feeRateBps,
|
|
581
|
+
nonce,
|
|
582
|
+
signer,
|
|
583
|
+
expiration,
|
|
584
|
+
signatureType
|
|
585
|
+
}) {
|
|
586
|
+
if (!signer) {
|
|
587
|
+
signer = maker;
|
|
588
|
+
}
|
|
589
|
+
const signerAddress = await getSignerAddress(this.signer);
|
|
590
|
+
if (signer !== signerAddress) {
|
|
591
|
+
throw new Error("signer does not match");
|
|
592
|
+
}
|
|
593
|
+
if (!expiration) {
|
|
594
|
+
expiration = "0";
|
|
595
|
+
}
|
|
596
|
+
if (!signatureType) {
|
|
597
|
+
signatureType = 0 /* EOA */;
|
|
598
|
+
}
|
|
599
|
+
let takerAddress;
|
|
600
|
+
if (typeof taker !== "undefined" && taker) {
|
|
601
|
+
takerAddress = taker;
|
|
602
|
+
} else {
|
|
603
|
+
takerAddress = ZERO_ADDRESS;
|
|
604
|
+
}
|
|
605
|
+
let feeRateBpsResolved;
|
|
606
|
+
if (typeof feeRateBps !== "undefined" && feeRateBps) {
|
|
607
|
+
feeRateBpsResolved = feeRateBps.toString();
|
|
608
|
+
} else {
|
|
609
|
+
feeRateBpsResolved = "0";
|
|
610
|
+
}
|
|
611
|
+
let nonceResolved;
|
|
612
|
+
if (typeof nonce !== "undefined" && nonce) {
|
|
613
|
+
nonceResolved = nonce.toString();
|
|
614
|
+
} else {
|
|
615
|
+
nonceResolved = "0";
|
|
616
|
+
}
|
|
617
|
+
return {
|
|
618
|
+
salt: this.generateSalt(),
|
|
619
|
+
maker,
|
|
620
|
+
signer,
|
|
621
|
+
taker: takerAddress,
|
|
622
|
+
tokenId,
|
|
623
|
+
makerAmount,
|
|
624
|
+
takerAmount,
|
|
625
|
+
expiration,
|
|
626
|
+
nonce: nonceResolved,
|
|
627
|
+
feeRateBps: feeRateBpsResolved,
|
|
628
|
+
side,
|
|
629
|
+
signatureType
|
|
630
|
+
};
|
|
631
|
+
}
|
|
632
|
+
/**
|
|
633
|
+
* Parses an Order object to EIP712 typed data
|
|
634
|
+
* @param order
|
|
635
|
+
* @returns a EIP712TypedData object
|
|
636
|
+
*/
|
|
637
|
+
buildOrderTypedData(order) {
|
|
638
|
+
return {
|
|
639
|
+
primaryType: "Order",
|
|
640
|
+
types: {
|
|
641
|
+
EIP712Domain: EIP712_DOMAIN,
|
|
642
|
+
Order: CTF_EXCHANGE_V1_ORDER_STRUCT
|
|
643
|
+
},
|
|
644
|
+
domain: {
|
|
645
|
+
name: CTF_EXCHANGE_V1_DOMAIN_NAME,
|
|
646
|
+
version: CTF_EXCHANGE_V1_DOMAIN_VERSION,
|
|
647
|
+
chainId: this.chainId,
|
|
648
|
+
verifyingContract: this.contractAddress
|
|
649
|
+
},
|
|
650
|
+
message: {
|
|
651
|
+
salt: order.salt,
|
|
652
|
+
maker: order.maker,
|
|
653
|
+
signer: order.signer,
|
|
654
|
+
taker: order.taker,
|
|
655
|
+
tokenId: order.tokenId,
|
|
656
|
+
makerAmount: order.makerAmount,
|
|
657
|
+
takerAmount: order.takerAmount,
|
|
658
|
+
expiration: order.expiration,
|
|
659
|
+
nonce: order.nonce,
|
|
660
|
+
feeRateBps: order.feeRateBps,
|
|
661
|
+
side: order.side === "BUY" ? 0 : 1,
|
|
662
|
+
signatureType: order.signatureType
|
|
663
|
+
}
|
|
664
|
+
};
|
|
665
|
+
}
|
|
666
|
+
/**
|
|
667
|
+
* Generates order's signature from a EIP712TypedData object + the signer address
|
|
668
|
+
* @param typedData
|
|
669
|
+
* @returns a OrderSignature that is an string
|
|
670
|
+
*/
|
|
671
|
+
buildOrderSignature(typedData) {
|
|
672
|
+
delete typedData.types.EIP712Domain;
|
|
673
|
+
return signTypedDataWithSigner({
|
|
674
|
+
signer: this.signer,
|
|
675
|
+
domain: typedData.domain,
|
|
676
|
+
types: typedData.types,
|
|
677
|
+
value: typedData.message,
|
|
678
|
+
primaryType: typedData.primaryType
|
|
679
|
+
});
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* Generates the hash of the order from a EIP712TypedData object.
|
|
683
|
+
* @param orderTypedData
|
|
684
|
+
* @returns a OrderHash that is an string
|
|
685
|
+
*/
|
|
686
|
+
buildOrderHash(orderTypedData) {
|
|
687
|
+
const digest = (0, import_viem2.hashTypedData)(orderTypedData);
|
|
688
|
+
return digest;
|
|
689
|
+
}
|
|
690
|
+
};
|
|
691
|
+
|
|
692
|
+
// src/order-utils/exchangeOrderBuilderV2.ts
|
|
693
|
+
var import_viem3 = require("viem");
|
|
694
|
+
|
|
695
|
+
// src/order-utils/model/ctfExchangeV2TypedData.ts
|
|
696
|
+
var CTF_EXCHANGE_V2_DOMAIN_NAME = "Polymarket CTF Exchange";
|
|
697
|
+
var CTF_EXCHANGE_V2_DOMAIN_VERSION = "2";
|
|
698
|
+
var CTF_EXCHANGE_V2_ORDER_STRUCT = [
|
|
699
|
+
{ name: "salt", type: "uint256" },
|
|
700
|
+
{ name: "maker", type: "address" },
|
|
701
|
+
{ name: "signer", type: "address" },
|
|
702
|
+
{ name: "tokenId", type: "uint256" },
|
|
703
|
+
{ name: "makerAmount", type: "uint256" },
|
|
704
|
+
{ name: "takerAmount", type: "uint256" },
|
|
705
|
+
{ name: "side", type: "uint8" },
|
|
706
|
+
{ name: "signatureType", type: "uint8" },
|
|
707
|
+
{ name: "timestamp", type: "uint256" },
|
|
708
|
+
{ name: "metadata", type: "bytes32" },
|
|
709
|
+
{ name: "builder", type: "bytes32" }
|
|
710
|
+
];
|
|
711
|
+
|
|
712
|
+
// src/order-utils/model/signatureTypeV2.ts
|
|
713
|
+
var SignatureTypeV2 = /* @__PURE__ */ ((SignatureTypeV22) => {
|
|
714
|
+
SignatureTypeV22[SignatureTypeV22["EOA"] = 0] = "EOA";
|
|
715
|
+
SignatureTypeV22[SignatureTypeV22["POLY_PROXY"] = 1] = "POLY_PROXY";
|
|
716
|
+
SignatureTypeV22[SignatureTypeV22["POLY_GNOSIS_SAFE"] = 2] = "POLY_GNOSIS_SAFE";
|
|
717
|
+
SignatureTypeV22[SignatureTypeV22["POLY_1271"] = 3] = "POLY_1271";
|
|
718
|
+
return SignatureTypeV22;
|
|
719
|
+
})(SignatureTypeV2 || {});
|
|
720
|
+
|
|
721
|
+
// src/order-utils/exchangeOrderBuilderV2.ts
|
|
722
|
+
var ExchangeOrderBuilderV2 = class {
|
|
723
|
+
constructor(contractAddress, chainId, signer, generateSalt = generateOrderSalt) {
|
|
724
|
+
this.contractAddress = contractAddress;
|
|
725
|
+
this.chainId = chainId;
|
|
726
|
+
this.signer = signer;
|
|
727
|
+
this.generateSalt = generateSalt;
|
|
728
|
+
}
|
|
729
|
+
contractAddress;
|
|
730
|
+
chainId;
|
|
731
|
+
signer;
|
|
732
|
+
generateSalt;
|
|
733
|
+
/**
|
|
734
|
+
* build an order object including the signature.
|
|
735
|
+
* @param orderData
|
|
736
|
+
* @returns a SignedOrder object (order + signature)
|
|
737
|
+
*/
|
|
738
|
+
async buildSignedOrder(orderData) {
|
|
739
|
+
const order = await this.buildOrder(orderData);
|
|
740
|
+
const orderTypedData = this.buildOrderTypedData(order);
|
|
741
|
+
const orderSignature = await this.buildOrderSignature(orderTypedData);
|
|
742
|
+
return {
|
|
743
|
+
...order,
|
|
744
|
+
signature: orderSignature
|
|
745
|
+
};
|
|
746
|
+
}
|
|
747
|
+
/**
|
|
748
|
+
* Creates an Order object from order data.
|
|
749
|
+
* @param OrderData
|
|
750
|
+
* @returns a Order object (not signed)
|
|
751
|
+
*/
|
|
752
|
+
async buildOrder({
|
|
753
|
+
maker,
|
|
754
|
+
tokenId,
|
|
755
|
+
makerAmount,
|
|
756
|
+
takerAmount,
|
|
757
|
+
side,
|
|
758
|
+
signer,
|
|
759
|
+
signatureType,
|
|
760
|
+
timestamp,
|
|
761
|
+
metadata,
|
|
762
|
+
builder,
|
|
763
|
+
expiration
|
|
764
|
+
}) {
|
|
765
|
+
if (!signer) {
|
|
766
|
+
signer = maker;
|
|
767
|
+
}
|
|
768
|
+
const signerAddress = await getSignerAddress(this.signer);
|
|
769
|
+
if (signer !== signerAddress) {
|
|
770
|
+
throw new Error("signer does not match");
|
|
771
|
+
}
|
|
772
|
+
return {
|
|
773
|
+
salt: this.generateSalt(),
|
|
774
|
+
maker,
|
|
775
|
+
signer,
|
|
776
|
+
tokenId,
|
|
777
|
+
makerAmount,
|
|
778
|
+
takerAmount,
|
|
779
|
+
side,
|
|
780
|
+
signatureType: signatureType ?? 0 /* EOA */,
|
|
781
|
+
metadata: metadata ?? bytes32Zero,
|
|
782
|
+
builder: builder ?? bytes32Zero,
|
|
783
|
+
timestamp: timestamp ?? Date.now().toString(),
|
|
784
|
+
expiration: expiration ?? "0"
|
|
785
|
+
};
|
|
786
|
+
}
|
|
787
|
+
/**
|
|
788
|
+
* Parses an Order object to EIP712 typed data
|
|
789
|
+
* @param order
|
|
790
|
+
* @returns a EIP712TypedData object
|
|
791
|
+
*/
|
|
792
|
+
buildOrderTypedData(order) {
|
|
793
|
+
return {
|
|
794
|
+
primaryType: "Order",
|
|
795
|
+
types: {
|
|
796
|
+
EIP712Domain: EIP712_DOMAIN,
|
|
797
|
+
Order: CTF_EXCHANGE_V2_ORDER_STRUCT
|
|
798
|
+
},
|
|
799
|
+
domain: {
|
|
800
|
+
name: CTF_EXCHANGE_V2_DOMAIN_NAME,
|
|
801
|
+
version: CTF_EXCHANGE_V2_DOMAIN_VERSION,
|
|
802
|
+
chainId: this.chainId,
|
|
803
|
+
verifyingContract: this.contractAddress
|
|
804
|
+
},
|
|
805
|
+
message: {
|
|
806
|
+
salt: order.salt,
|
|
807
|
+
maker: order.maker,
|
|
808
|
+
signer: order.signer,
|
|
809
|
+
tokenId: order.tokenId,
|
|
810
|
+
makerAmount: order.makerAmount,
|
|
811
|
+
takerAmount: order.takerAmount,
|
|
812
|
+
timestamp: order.timestamp,
|
|
813
|
+
side: order.side === "BUY" ? 0 : 1,
|
|
814
|
+
signatureType: order.signatureType,
|
|
815
|
+
metadata: order.metadata,
|
|
816
|
+
builder: order.builder
|
|
817
|
+
}
|
|
818
|
+
};
|
|
819
|
+
}
|
|
820
|
+
/**
|
|
821
|
+
* Generates order's signature from a EIP712TypedData object + the signer address
|
|
822
|
+
* @param typedData
|
|
823
|
+
* @returns a OrderSignature that is an string
|
|
824
|
+
*/
|
|
825
|
+
buildOrderSignature(typedData) {
|
|
826
|
+
delete typedData.types.EIP712Domain;
|
|
827
|
+
return signTypedDataWithSigner({
|
|
828
|
+
signer: this.signer,
|
|
829
|
+
domain: typedData.domain,
|
|
830
|
+
types: typedData.types,
|
|
831
|
+
value: typedData.message,
|
|
832
|
+
primaryType: typedData.primaryType
|
|
833
|
+
});
|
|
834
|
+
}
|
|
835
|
+
/**
|
|
836
|
+
* Generates the hash of the order from a EIP712TypedData object.
|
|
837
|
+
* @param orderTypedData
|
|
838
|
+
* @returns a OrderHash that is an string
|
|
839
|
+
*/
|
|
840
|
+
buildOrderHash(orderTypedData) {
|
|
841
|
+
const digest = (0, import_viem3.hashTypedData)(orderTypedData);
|
|
842
|
+
return digest;
|
|
843
|
+
}
|
|
844
|
+
};
|
|
845
|
+
|
|
846
|
+
// src/order-builder/helpers/buildOrder.ts
|
|
847
|
+
var buildOrder = async (signer, exchangeAddress, chainId, orderData, version = 2) => {
|
|
848
|
+
switch (version) {
|
|
849
|
+
case 1:
|
|
850
|
+
return buildOrderV1(signer, exchangeAddress, chainId, orderData);
|
|
851
|
+
case 2:
|
|
852
|
+
return buildOrderV2(signer, exchangeAddress, chainId, orderData);
|
|
853
|
+
default:
|
|
854
|
+
throw new Error(`unsupported order version ${version}`);
|
|
855
|
+
}
|
|
856
|
+
};
|
|
857
|
+
var buildOrderV1 = async (signer, exchangeAddress, chainId, orderData) => {
|
|
858
|
+
const ctfExchangeOrderBuilder = new ExchangeOrderBuilderV1(exchangeAddress, chainId, signer);
|
|
859
|
+
return ctfExchangeOrderBuilder.buildSignedOrder(orderData);
|
|
860
|
+
};
|
|
861
|
+
var buildOrderV2 = async (signer, exchangeAddress, chainId, orderData) => {
|
|
862
|
+
const ctfExchangeOrderBuilder = new ExchangeOrderBuilderV2(exchangeAddress, chainId, signer);
|
|
863
|
+
return ctfExchangeOrderBuilder.buildSignedOrder(orderData);
|
|
864
|
+
};
|
|
865
|
+
|
|
866
|
+
// src/order-builder/helpers/buildOrderCreationArgs.ts
|
|
867
|
+
var import_viem4 = require("viem");
|
|
868
|
+
|
|
869
|
+
// src/order-utils/model/side.ts
|
|
870
|
+
var Side = /* @__PURE__ */ ((Side2) => {
|
|
871
|
+
Side2["BUY"] = "BUY";
|
|
872
|
+
Side2["SELL"] = "SELL";
|
|
873
|
+
return Side2;
|
|
874
|
+
})(Side || {});
|
|
875
|
+
|
|
876
|
+
// src/types/clob.ts
|
|
877
|
+
var OrderType = /* @__PURE__ */ ((OrderType2) => {
|
|
878
|
+
OrderType2["GTC"] = "GTC";
|
|
879
|
+
OrderType2["FOK"] = "FOK";
|
|
880
|
+
OrderType2["GTD"] = "GTD";
|
|
881
|
+
OrderType2["FAK"] = "FAK";
|
|
882
|
+
return OrderType2;
|
|
883
|
+
})(OrderType || {});
|
|
884
|
+
var Chain = /* @__PURE__ */ ((Chain2) => {
|
|
885
|
+
Chain2[Chain2["POLYGON"] = 137] = "POLYGON";
|
|
886
|
+
Chain2[Chain2["AMOY"] = 80002] = "AMOY";
|
|
887
|
+
return Chain2;
|
|
888
|
+
})(Chain || {});
|
|
889
|
+
var PriceHistoryInterval = /* @__PURE__ */ ((PriceHistoryInterval2) => {
|
|
890
|
+
PriceHistoryInterval2["MAX"] = "max";
|
|
891
|
+
PriceHistoryInterval2["ONE_WEEK"] = "1w";
|
|
892
|
+
PriceHistoryInterval2["ONE_DAY"] = "1d";
|
|
893
|
+
PriceHistoryInterval2["SIX_HOURS"] = "6h";
|
|
894
|
+
PriceHistoryInterval2["ONE_HOUR"] = "1h";
|
|
895
|
+
return PriceHistoryInterval2;
|
|
896
|
+
})(PriceHistoryInterval || {});
|
|
897
|
+
var AssetType = /* @__PURE__ */ ((AssetType2) => {
|
|
898
|
+
AssetType2["COLLATERAL"] = "COLLATERAL";
|
|
899
|
+
AssetType2["CONDITIONAL"] = "CONDITIONAL";
|
|
900
|
+
return AssetType2;
|
|
901
|
+
})(AssetType || {});
|
|
902
|
+
|
|
903
|
+
// src/types/ordersV1.ts
|
|
904
|
+
function orderToJsonV1(order, owner, orderType, postOnly = false, deferExec = false) {
|
|
905
|
+
return {
|
|
906
|
+
deferExec,
|
|
907
|
+
postOnly,
|
|
908
|
+
order: {
|
|
909
|
+
salt: parseInt(order.salt, 10),
|
|
910
|
+
maker: order.maker,
|
|
911
|
+
signer: order.signer,
|
|
912
|
+
taker: order.taker,
|
|
913
|
+
tokenId: order.tokenId,
|
|
914
|
+
makerAmount: order.makerAmount,
|
|
915
|
+
takerAmount: order.takerAmount,
|
|
916
|
+
side: order.side,
|
|
917
|
+
expiration: order.expiration,
|
|
918
|
+
nonce: order.nonce,
|
|
919
|
+
feeRateBps: order.feeRateBps,
|
|
920
|
+
signatureType: order.signatureType,
|
|
921
|
+
signature: order.signature
|
|
922
|
+
},
|
|
923
|
+
owner,
|
|
924
|
+
orderType
|
|
925
|
+
};
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
// src/types/ordersV2.ts
|
|
929
|
+
function orderToJsonV2(order, owner, orderType, postOnly = false, deferExec = false) {
|
|
930
|
+
return {
|
|
931
|
+
deferExec,
|
|
932
|
+
postOnly,
|
|
933
|
+
order: {
|
|
934
|
+
salt: parseInt(order.salt, 10),
|
|
935
|
+
maker: order.maker,
|
|
936
|
+
signer: order.signer,
|
|
937
|
+
taker: order.taker,
|
|
938
|
+
tokenId: order.tokenId,
|
|
939
|
+
makerAmount: order.makerAmount,
|
|
940
|
+
takerAmount: order.takerAmount,
|
|
941
|
+
side: order.side,
|
|
942
|
+
signatureType: order.signatureType,
|
|
943
|
+
timestamp: order.timestamp,
|
|
944
|
+
expiration: order.expiration,
|
|
945
|
+
metadata: order.metadata,
|
|
946
|
+
builder: order.builder,
|
|
947
|
+
signature: order.signature
|
|
948
|
+
},
|
|
949
|
+
owner,
|
|
950
|
+
orderType
|
|
951
|
+
};
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
// src/types/unifiedOrder.ts
|
|
955
|
+
function isV2Order(order) {
|
|
956
|
+
if ("version" in order && "order" in order) {
|
|
957
|
+
return order.version === 2;
|
|
958
|
+
}
|
|
959
|
+
return "timestamp" in order && "metadata" in order && "builder" in order;
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
// src/utilities.ts
|
|
963
|
+
var import_node_crypto2 = require("crypto");
|
|
964
|
+
var roundNormal = (num, decimals) => {
|
|
965
|
+
if (decimalPlaces(num) <= decimals) {
|
|
966
|
+
return num;
|
|
967
|
+
}
|
|
968
|
+
return Math.round((num + Number.EPSILON) * 10 ** decimals) / 10 ** decimals;
|
|
969
|
+
};
|
|
970
|
+
var roundDown = (num, decimals) => {
|
|
971
|
+
if (decimalPlaces(num) <= decimals) {
|
|
972
|
+
return num;
|
|
973
|
+
}
|
|
974
|
+
return Math.floor(num * 10 ** decimals) / 10 ** decimals;
|
|
975
|
+
};
|
|
976
|
+
var roundUp = (num, decimals) => {
|
|
977
|
+
if (decimalPlaces(num) <= decimals) {
|
|
978
|
+
return num;
|
|
979
|
+
}
|
|
980
|
+
return Math.ceil(num * 10 ** decimals) / 10 ** decimals;
|
|
981
|
+
};
|
|
982
|
+
var decimalPlaces = (num) => {
|
|
983
|
+
if (Number.isInteger(num)) {
|
|
984
|
+
return 0;
|
|
985
|
+
}
|
|
986
|
+
const arr = num.toString().split(".");
|
|
987
|
+
if (arr.length <= 1) {
|
|
988
|
+
return 0;
|
|
989
|
+
}
|
|
990
|
+
return arr[1].length;
|
|
991
|
+
};
|
|
992
|
+
var generateOrderBookSummaryHash = (orderbook) => {
|
|
993
|
+
orderbook.hash = "";
|
|
994
|
+
const hash = (0, import_node_crypto2.createHash)("sha1").update(JSON.stringify(orderbook)).digest("hex");
|
|
995
|
+
orderbook.hash = hash;
|
|
996
|
+
return hash;
|
|
997
|
+
};
|
|
998
|
+
var isTickSizeSmaller = (a, b) => {
|
|
999
|
+
return parseFloat(a) < parseFloat(b);
|
|
1000
|
+
};
|
|
1001
|
+
var priceValid = (price, tickSize) => {
|
|
1002
|
+
return price >= parseFloat(tickSize) && price <= 1 - parseFloat(tickSize);
|
|
1003
|
+
};
|
|
1004
|
+
|
|
1005
|
+
// src/order-builder/helpers/getOrderRawAmounts.ts
|
|
1006
|
+
var getOrderRawAmounts = (side, size, price, roundConfig) => {
|
|
1007
|
+
const rawPrice = roundNormal(price, roundConfig.price);
|
|
1008
|
+
if (side === "BUY" /* BUY */) {
|
|
1009
|
+
const rawTakerAmt = roundDown(size, roundConfig.size);
|
|
1010
|
+
let rawMakerAmt = rawTakerAmt * rawPrice;
|
|
1011
|
+
if (decimalPlaces(rawMakerAmt) > roundConfig.amount) {
|
|
1012
|
+
rawMakerAmt = roundUp(rawMakerAmt, roundConfig.amount + 4);
|
|
1013
|
+
if (decimalPlaces(rawMakerAmt) > roundConfig.amount) {
|
|
1014
|
+
rawMakerAmt = roundDown(rawMakerAmt, roundConfig.amount);
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
return {
|
|
1018
|
+
side: "BUY" /* BUY */,
|
|
1019
|
+
rawMakerAmt,
|
|
1020
|
+
rawTakerAmt
|
|
1021
|
+
};
|
|
1022
|
+
} else {
|
|
1023
|
+
const rawMakerAmt = roundDown(size, roundConfig.size);
|
|
1024
|
+
let rawTakerAmt = rawMakerAmt * rawPrice;
|
|
1025
|
+
if (decimalPlaces(rawTakerAmt) > roundConfig.amount) {
|
|
1026
|
+
rawTakerAmt = roundUp(rawTakerAmt, roundConfig.amount + 4);
|
|
1027
|
+
if (decimalPlaces(rawTakerAmt) > roundConfig.amount) {
|
|
1028
|
+
rawTakerAmt = roundDown(rawTakerAmt, roundConfig.amount);
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
return {
|
|
1032
|
+
side: "SELL" /* SELL */,
|
|
1033
|
+
rawMakerAmt,
|
|
1034
|
+
rawTakerAmt
|
|
1035
|
+
};
|
|
1036
|
+
}
|
|
1037
|
+
};
|
|
1038
|
+
|
|
1039
|
+
// src/order-builder/helpers/buildOrderCreationArgs.ts
|
|
1040
|
+
async function buildOrderCreationArgs(signer, maker, signatureType, userOrder, roundConfig, version = 2) {
|
|
1041
|
+
const { side, rawMakerAmt, rawTakerAmt } = getOrderRawAmounts(
|
|
1042
|
+
userOrder.side,
|
|
1043
|
+
userOrder.size,
|
|
1044
|
+
userOrder.price,
|
|
1045
|
+
roundConfig
|
|
1046
|
+
);
|
|
1047
|
+
const makerAmount = (0, import_viem4.parseUnits)(rawMakerAmt.toString(), COLLATERAL_TOKEN_DECIMALS).toString();
|
|
1048
|
+
const takerAmount = (0, import_viem4.parseUnits)(rawTakerAmt.toString(), COLLATERAL_TOKEN_DECIMALS).toString();
|
|
1049
|
+
if (version === 1) {
|
|
1050
|
+
const v1Order = userOrder;
|
|
1051
|
+
return {
|
|
1052
|
+
maker,
|
|
1053
|
+
taker: v1Order.taker ?? import_viem4.zeroAddress,
|
|
1054
|
+
tokenId: userOrder.tokenID,
|
|
1055
|
+
makerAmount,
|
|
1056
|
+
takerAmount,
|
|
1057
|
+
side,
|
|
1058
|
+
signer,
|
|
1059
|
+
signatureType,
|
|
1060
|
+
feeRateBps: v1Order.feeRateBps?.toString() ?? "0",
|
|
1061
|
+
nonce: v1Order.nonce?.toString() ?? "0",
|
|
1062
|
+
expiration: userOrder.expiration !== void 0 ? userOrder.expiration.toString() : "0"
|
|
1063
|
+
};
|
|
1064
|
+
}
|
|
1065
|
+
return {
|
|
1066
|
+
maker,
|
|
1067
|
+
tokenId: userOrder.tokenID,
|
|
1068
|
+
makerAmount,
|
|
1069
|
+
takerAmount,
|
|
1070
|
+
side,
|
|
1071
|
+
signer,
|
|
1072
|
+
signatureType,
|
|
1073
|
+
timestamp: Date.now().toString(),
|
|
1074
|
+
metadata: "metadata" in userOrder ? userOrder.metadata ?? bytes32Zero : bytes32Zero,
|
|
1075
|
+
builder: userOrder.builderCode ?? bytes32Zero,
|
|
1076
|
+
expiration: userOrder.expiration !== void 0 ? userOrder.expiration.toString() : "0"
|
|
1077
|
+
};
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
// src/order-builder/helpers/calculateBuyMarketPrice.ts
|
|
1081
|
+
var calculateBuyMarketPrice = (positions, amountToMatch, orderType) => {
|
|
1082
|
+
if (!positions.length) {
|
|
1083
|
+
throw new Error("no match");
|
|
1084
|
+
}
|
|
1085
|
+
let sum = 0;
|
|
1086
|
+
for (let i = positions.length - 1; i >= 0; i--) {
|
|
1087
|
+
const p = positions[i];
|
|
1088
|
+
sum += parseFloat(p.size) * parseFloat(p.price);
|
|
1089
|
+
if (sum >= amountToMatch) {
|
|
1090
|
+
return parseFloat(p.price);
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
if (orderType === "FOK" /* FOK */) {
|
|
1094
|
+
throw new Error("no match");
|
|
1095
|
+
}
|
|
1096
|
+
return parseFloat(positions[0].price);
|
|
1097
|
+
};
|
|
1098
|
+
|
|
1099
|
+
// src/order-builder/helpers/calculateSellMarketPrice.ts
|
|
1100
|
+
var calculateSellMarketPrice = (positions, amountToMatch, orderType) => {
|
|
1101
|
+
if (!positions.length) {
|
|
1102
|
+
throw new Error("no match");
|
|
1103
|
+
}
|
|
1104
|
+
let sum = 0;
|
|
1105
|
+
for (let i = positions.length - 1; i >= 0; i--) {
|
|
1106
|
+
const p = positions[i];
|
|
1107
|
+
sum += parseFloat(p.size);
|
|
1108
|
+
if (sum >= amountToMatch) {
|
|
1109
|
+
return parseFloat(p.price);
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
if (orderType === "FOK" /* FOK */) {
|
|
1113
|
+
throw new Error("no match");
|
|
1114
|
+
}
|
|
1115
|
+
return parseFloat(positions[0].price);
|
|
1116
|
+
};
|
|
1117
|
+
|
|
1118
|
+
// src/order-builder/helpers/roundingConfig.ts
|
|
1119
|
+
var ROUNDING_CONFIG = {
|
|
1120
|
+
"0.1": {
|
|
1121
|
+
price: 1,
|
|
1122
|
+
size: 2,
|
|
1123
|
+
amount: 3
|
|
1124
|
+
},
|
|
1125
|
+
"0.01": {
|
|
1126
|
+
price: 2,
|
|
1127
|
+
size: 2,
|
|
1128
|
+
amount: 4
|
|
1129
|
+
},
|
|
1130
|
+
"0.001": {
|
|
1131
|
+
price: 3,
|
|
1132
|
+
size: 2,
|
|
1133
|
+
amount: 5
|
|
1134
|
+
},
|
|
1135
|
+
"0.0001": {
|
|
1136
|
+
price: 4,
|
|
1137
|
+
size: 2,
|
|
1138
|
+
amount: 6
|
|
1139
|
+
}
|
|
1140
|
+
};
|
|
1141
|
+
|
|
1142
|
+
// src/order-builder/helpers/createMarketOrder.ts
|
|
1143
|
+
var createMarketOrder = async (eoaSigner, chainId, signatureType, funderAddress, userMarketOrder, options, version) => {
|
|
1144
|
+
const eoaSignerAddress = await getSignerAddress(eoaSigner);
|
|
1145
|
+
const maker = funderAddress === void 0 ? eoaSignerAddress : funderAddress;
|
|
1146
|
+
const contractConfig = getContractConfig(chainId);
|
|
1147
|
+
const orderData = await buildMarketOrderCreationArgs(
|
|
1148
|
+
eoaSignerAddress,
|
|
1149
|
+
maker,
|
|
1150
|
+
signatureType,
|
|
1151
|
+
userMarketOrder,
|
|
1152
|
+
ROUNDING_CONFIG[options.tickSize],
|
|
1153
|
+
version
|
|
1154
|
+
);
|
|
1155
|
+
let exchangeContract;
|
|
1156
|
+
switch (version) {
|
|
1157
|
+
case 1:
|
|
1158
|
+
if (signatureType === 3 /* POLY_1271 */) {
|
|
1159
|
+
throw new Error(`signature type POLY_1271 is not supported for v1 orders`);
|
|
1160
|
+
}
|
|
1161
|
+
exchangeContract = options.negRisk ? contractConfig.negRiskExchange : contractConfig.exchange;
|
|
1162
|
+
break;
|
|
1163
|
+
case 2:
|
|
1164
|
+
exchangeContract = options.negRisk ? contractConfig.negRiskExchangeV2 : contractConfig.exchangeV2;
|
|
1165
|
+
break;
|
|
1166
|
+
default:
|
|
1167
|
+
throw new Error(`unsupported order version ${version}`);
|
|
1168
|
+
}
|
|
1169
|
+
return buildOrder(eoaSigner, exchangeContract, chainId, orderData, version);
|
|
1170
|
+
};
|
|
1171
|
+
|
|
1172
|
+
// src/order-builder/helpers/createOrder.ts
|
|
1173
|
+
var createOrder = async (eoaSigner, chainId, signatureType, funderAddress, userOrder, options, version) => {
|
|
1174
|
+
const eoaSignerAddress = await getSignerAddress(eoaSigner);
|
|
1175
|
+
const maker = funderAddress === void 0 ? eoaSignerAddress : funderAddress;
|
|
1176
|
+
const contractConfig = getContractConfig(chainId);
|
|
1177
|
+
const orderData = await buildOrderCreationArgs(
|
|
1178
|
+
eoaSignerAddress,
|
|
1179
|
+
maker,
|
|
1180
|
+
signatureType,
|
|
1181
|
+
userOrder,
|
|
1182
|
+
ROUNDING_CONFIG[options.tickSize],
|
|
1183
|
+
version
|
|
1184
|
+
);
|
|
1185
|
+
let exchangeContract;
|
|
1186
|
+
switch (version) {
|
|
1187
|
+
case 1:
|
|
1188
|
+
if (signatureType === 3 /* POLY_1271 */) {
|
|
1189
|
+
throw new Error(`signature type POLY_1271 is not supported for v1 orders`);
|
|
1190
|
+
}
|
|
1191
|
+
exchangeContract = options.negRisk ? contractConfig.negRiskExchange : contractConfig.exchange;
|
|
1192
|
+
break;
|
|
1193
|
+
case 2:
|
|
1194
|
+
exchangeContract = options.negRisk ? contractConfig.negRiskExchangeV2 : contractConfig.exchangeV2;
|
|
1195
|
+
break;
|
|
1196
|
+
default:
|
|
1197
|
+
throw new Error(`unsupported order version ${version}`);
|
|
1198
|
+
}
|
|
1199
|
+
return buildOrder(eoaSigner, exchangeContract, chainId, orderData, version);
|
|
1200
|
+
};
|
|
1201
|
+
|
|
1202
|
+
// src/order-builder/helpers/getMarketOrderRawAmounts.ts
|
|
1203
|
+
var getMarketOrderRawAmounts = (side, amount, price, roundConfig) => {
|
|
1204
|
+
const rawPrice = roundDown(price, roundConfig.price);
|
|
1205
|
+
if (side === "BUY" /* BUY */) {
|
|
1206
|
+
const rawMakerAmt = roundDown(amount, roundConfig.size);
|
|
1207
|
+
let rawTakerAmt = rawMakerAmt / rawPrice;
|
|
1208
|
+
if (decimalPlaces(rawTakerAmt) > roundConfig.amount) {
|
|
1209
|
+
rawTakerAmt = roundUp(rawTakerAmt, roundConfig.amount + 4);
|
|
1210
|
+
if (decimalPlaces(rawTakerAmt) > roundConfig.amount) {
|
|
1211
|
+
rawTakerAmt = roundDown(rawTakerAmt, roundConfig.amount);
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
return {
|
|
1215
|
+
side: "BUY" /* BUY */,
|
|
1216
|
+
rawMakerAmt,
|
|
1217
|
+
rawTakerAmt
|
|
1218
|
+
};
|
|
1219
|
+
} else {
|
|
1220
|
+
const rawMakerAmt = roundDown(amount, roundConfig.size);
|
|
1221
|
+
let rawTakerAmt = rawMakerAmt * rawPrice;
|
|
1222
|
+
if (decimalPlaces(rawTakerAmt) > roundConfig.amount) {
|
|
1223
|
+
rawTakerAmt = roundUp(rawTakerAmt, roundConfig.amount + 4);
|
|
1224
|
+
if (decimalPlaces(rawTakerAmt) > roundConfig.amount) {
|
|
1225
|
+
rawTakerAmt = roundDown(rawTakerAmt, roundConfig.amount);
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
return {
|
|
1229
|
+
side: "SELL" /* SELL */,
|
|
1230
|
+
rawMakerAmt,
|
|
1231
|
+
rawTakerAmt
|
|
1232
|
+
};
|
|
1233
|
+
}
|
|
1234
|
+
};
|
|
1235
|
+
|
|
1236
|
+
// src/order-builder/orderBuilder.ts
|
|
1237
|
+
var OrderBuilder = class {
|
|
1238
|
+
signer;
|
|
1239
|
+
chainId;
|
|
1240
|
+
// Signature type used sign orders, defaults to EOA type
|
|
1241
|
+
signatureType;
|
|
1242
|
+
// Address which holds funds to be used.
|
|
1243
|
+
// Used for Polymarket proxy wallets and other smart contract wallets
|
|
1244
|
+
// If not provided, funderAddress is the signer address
|
|
1245
|
+
funderAddress;
|
|
1246
|
+
/**
|
|
1247
|
+
* Optional function to dynamically resolve the signer.
|
|
1248
|
+
* If provided, this function will be called to obtain a fresh signer instance
|
|
1249
|
+
* (e.g., for smart contract wallets or when the signer may change).
|
|
1250
|
+
* Should return a Wallet or JsonRpcSigner, or a Promise resolving to one.
|
|
1251
|
+
* If not provided, the static `signer` property is used.
|
|
1252
|
+
*/
|
|
1253
|
+
getSigner;
|
|
1254
|
+
constructor(signer, chainId, signatureType, funderAddress, getSigner) {
|
|
1255
|
+
this.signer = signer;
|
|
1256
|
+
this.chainId = chainId;
|
|
1257
|
+
this.signatureType = signatureType === void 0 ? 0 /* EOA */ : signatureType;
|
|
1258
|
+
this.funderAddress = funderAddress;
|
|
1259
|
+
this.getSigner = getSigner;
|
|
1260
|
+
}
|
|
1261
|
+
/**
|
|
1262
|
+
* Generate and sign a order
|
|
1263
|
+
*/
|
|
1264
|
+
async buildOrder(userOrder, options, version) {
|
|
1265
|
+
const signer = await this.resolveSigner();
|
|
1266
|
+
return createOrder(
|
|
1267
|
+
signer,
|
|
1268
|
+
this.chainId,
|
|
1269
|
+
this.signatureType,
|
|
1270
|
+
this.funderAddress,
|
|
1271
|
+
userOrder,
|
|
1272
|
+
options,
|
|
1273
|
+
version
|
|
1274
|
+
);
|
|
1275
|
+
}
|
|
1276
|
+
/**
|
|
1277
|
+
* Generate and sign a market order
|
|
1278
|
+
*/
|
|
1279
|
+
async buildMarketOrder(userMarketOrder, options, version) {
|
|
1280
|
+
const signer = await this.resolveSigner();
|
|
1281
|
+
return createMarketOrder(
|
|
1282
|
+
signer,
|
|
1283
|
+
this.chainId,
|
|
1284
|
+
this.signatureType,
|
|
1285
|
+
this.funderAddress,
|
|
1286
|
+
userMarketOrder,
|
|
1287
|
+
options,
|
|
1288
|
+
version
|
|
1289
|
+
);
|
|
1290
|
+
}
|
|
1291
|
+
/** Unified getter: use fresh signer if available */
|
|
1292
|
+
async resolveSigner() {
|
|
1293
|
+
if (this.getSigner) {
|
|
1294
|
+
const s = await this.getSigner();
|
|
1295
|
+
if (!s) throw new Error("getSigner() function returned undefined or null");
|
|
1296
|
+
return s;
|
|
1297
|
+
}
|
|
1298
|
+
return this.signer;
|
|
1299
|
+
}
|
|
1300
|
+
};
|
|
1301
|
+
|
|
1302
|
+
// src/client.ts
|
|
1303
|
+
function adjustBuyAmountForFees(amount, price, userUSDCBalance, feeRate, feeExponent, builderTakerFeeRate) {
|
|
1304
|
+
const platformFeeRate = feeRate * (price * (1 - price)) ** feeExponent;
|
|
1305
|
+
const platformFee = amount / price * platformFeeRate;
|
|
1306
|
+
const totalCost = amount + platformFee + amount * builderTakerFeeRate;
|
|
1307
|
+
if (userUSDCBalance <= totalCost) {
|
|
1308
|
+
return userUSDCBalance / (1 + platformFeeRate / price + builderTakerFeeRate);
|
|
1309
|
+
}
|
|
1310
|
+
return amount;
|
|
1311
|
+
}
|
|
1312
|
+
var ClobClient = class {
|
|
1313
|
+
host;
|
|
1314
|
+
chainId;
|
|
1315
|
+
// Used to perform Level 1 authentication and sign orders
|
|
1316
|
+
signer;
|
|
1317
|
+
// Used to perform Level 2 authentication
|
|
1318
|
+
creds;
|
|
1319
|
+
orderBuilder;
|
|
1320
|
+
tickSizes;
|
|
1321
|
+
negRisk;
|
|
1322
|
+
feeInfos;
|
|
1323
|
+
// Fee rate bps data for CLOB V1
|
|
1324
|
+
feeRates;
|
|
1325
|
+
builderFeeRates;
|
|
1326
|
+
tokenConditionMap;
|
|
1327
|
+
useServerTime;
|
|
1328
|
+
builderConfig;
|
|
1329
|
+
cachedVersion;
|
|
1330
|
+
retryOnError;
|
|
1331
|
+
throwOnError;
|
|
1332
|
+
constructor({
|
|
1333
|
+
host,
|
|
1334
|
+
chain,
|
|
1335
|
+
signer,
|
|
1336
|
+
creds,
|
|
1337
|
+
signatureType,
|
|
1338
|
+
funderAddress,
|
|
1339
|
+
useServerTime,
|
|
1340
|
+
builderConfig,
|
|
1341
|
+
getSigner,
|
|
1342
|
+
retryOnError,
|
|
1343
|
+
throwOnError
|
|
1344
|
+
}) {
|
|
1345
|
+
this.host = host.endsWith("/") ? host.slice(0, -1) : host;
|
|
1346
|
+
this.chainId = chain;
|
|
1347
|
+
if (signer !== void 0) {
|
|
1348
|
+
this.signer = signer;
|
|
1349
|
+
}
|
|
1350
|
+
if (creds !== void 0) {
|
|
1351
|
+
this.creds = creds;
|
|
1352
|
+
}
|
|
1353
|
+
this.orderBuilder = new OrderBuilder(
|
|
1354
|
+
signer,
|
|
1355
|
+
chain,
|
|
1356
|
+
signatureType,
|
|
1357
|
+
funderAddress,
|
|
1358
|
+
getSigner
|
|
1359
|
+
);
|
|
1360
|
+
this.tickSizes = {};
|
|
1361
|
+
this.negRisk = {};
|
|
1362
|
+
this.feeRates = {};
|
|
1363
|
+
this.feeInfos = {};
|
|
1364
|
+
this.builderFeeRates = {};
|
|
1365
|
+
this.tokenConditionMap = {};
|
|
1366
|
+
this.retryOnError = retryOnError;
|
|
1367
|
+
this.throwOnError = throwOnError;
|
|
1368
|
+
this.useServerTime = useServerTime;
|
|
1369
|
+
if (builderConfig !== void 0) {
|
|
1370
|
+
this.builderConfig = builderConfig;
|
|
1371
|
+
}
|
|
1372
|
+
}
|
|
1373
|
+
// Public endpoints
|
|
1374
|
+
async getOk() {
|
|
1375
|
+
return this.get(`${this.host}${OK}`);
|
|
1376
|
+
}
|
|
1377
|
+
async postHeartbeat(heartbeatId = "") {
|
|
1378
|
+
this.canL2Auth();
|
|
1379
|
+
const body = JSON.stringify({ heartbeat_id: heartbeatId });
|
|
1380
|
+
const headers = await createL2Headers(
|
|
1381
|
+
this.signer,
|
|
1382
|
+
this.creds,
|
|
1383
|
+
{ method: POST, requestPath: HEARTBEAT, body },
|
|
1384
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1385
|
+
);
|
|
1386
|
+
return this.post(`${this.host}${HEARTBEAT}`, {
|
|
1387
|
+
headers,
|
|
1388
|
+
data: { heartbeat_id: heartbeatId }
|
|
1389
|
+
});
|
|
1390
|
+
}
|
|
1391
|
+
async getVersion() {
|
|
1392
|
+
const response = await this.get(`${this.host}/version`);
|
|
1393
|
+
return response?.version ?? 2;
|
|
1394
|
+
}
|
|
1395
|
+
async getServerTime() {
|
|
1396
|
+
return this.get(`${this.host}${TIME}`);
|
|
1397
|
+
}
|
|
1398
|
+
async getSamplingSimplifiedMarkets(next_cursor = INITIAL_CURSOR) {
|
|
1399
|
+
return this.get(`${this.host}${GET_SAMPLING_SIMPLIFIED_MARKETS}`, {
|
|
1400
|
+
params: { next_cursor }
|
|
1401
|
+
});
|
|
1402
|
+
}
|
|
1403
|
+
async getSamplingMarkets(next_cursor = INITIAL_CURSOR) {
|
|
1404
|
+
return this.get(`${this.host}${GET_SAMPLING_MARKETS}`, {
|
|
1405
|
+
params: { next_cursor }
|
|
1406
|
+
});
|
|
1407
|
+
}
|
|
1408
|
+
async getSimplifiedMarkets(next_cursor = INITIAL_CURSOR) {
|
|
1409
|
+
return this.get(`${this.host}${GET_SIMPLIFIED_MARKETS}`, {
|
|
1410
|
+
params: { next_cursor }
|
|
1411
|
+
});
|
|
1412
|
+
}
|
|
1413
|
+
async getMarkets(next_cursor = INITIAL_CURSOR) {
|
|
1414
|
+
return this.get(`${this.host}${GET_MARKETS}`, {
|
|
1415
|
+
params: { next_cursor }
|
|
1416
|
+
});
|
|
1417
|
+
}
|
|
1418
|
+
async getMarket(conditionID) {
|
|
1419
|
+
return this.get(`${this.host}${GET_MARKET}${conditionID}`);
|
|
1420
|
+
}
|
|
1421
|
+
async getClobMarketInfo(conditionID) {
|
|
1422
|
+
const result = await this.get(
|
|
1423
|
+
`${this.host}${GET_CLOB_MARKET}${conditionID}`
|
|
1424
|
+
);
|
|
1425
|
+
if (!result?.t) {
|
|
1426
|
+
throw new Error(`failed to fetch market info for condition id ${conditionID}`);
|
|
1427
|
+
}
|
|
1428
|
+
for (const token of result.t) {
|
|
1429
|
+
if (!token) continue;
|
|
1430
|
+
const tokenId = token.t;
|
|
1431
|
+
this.tokenConditionMap[tokenId] = conditionID;
|
|
1432
|
+
this.tickSizes[tokenId] = result.mts.toString();
|
|
1433
|
+
this.negRisk[tokenId] = result.nr ?? false;
|
|
1434
|
+
this.feeInfos[tokenId] = {
|
|
1435
|
+
rate: result.fd?.r ?? 0,
|
|
1436
|
+
exponent: result.fd?.e ?? 0
|
|
1437
|
+
};
|
|
1438
|
+
}
|
|
1439
|
+
return result;
|
|
1440
|
+
}
|
|
1441
|
+
async getOrderBook(tokenID) {
|
|
1442
|
+
return this.get(`${this.host}${GET_ORDER_BOOK}`, {
|
|
1443
|
+
params: { token_id: tokenID }
|
|
1444
|
+
});
|
|
1445
|
+
}
|
|
1446
|
+
async getOrderBooks(params) {
|
|
1447
|
+
return this.post(`${this.host}${GET_ORDER_BOOKS}`, {
|
|
1448
|
+
data: params
|
|
1449
|
+
});
|
|
1450
|
+
}
|
|
1451
|
+
async getTickSize(tokenID) {
|
|
1452
|
+
if (tokenID in this.tickSizes) {
|
|
1453
|
+
return this.tickSizes[tokenID];
|
|
1454
|
+
}
|
|
1455
|
+
if (tokenID in this.tokenConditionMap) {
|
|
1456
|
+
await this.getClobMarketInfo(this.tokenConditionMap[tokenID]);
|
|
1457
|
+
return this.tickSizes[tokenID];
|
|
1458
|
+
}
|
|
1459
|
+
const result = await this.get(`${this.host}${GET_TICK_SIZE}`, {
|
|
1460
|
+
params: { token_id: tokenID }
|
|
1461
|
+
});
|
|
1462
|
+
this.tickSizes[tokenID] = result.minimum_tick_size.toString();
|
|
1463
|
+
return this.tickSizes[tokenID];
|
|
1464
|
+
}
|
|
1465
|
+
async getNegRisk(tokenID) {
|
|
1466
|
+
if (tokenID in this.negRisk) {
|
|
1467
|
+
return this.negRisk[tokenID];
|
|
1468
|
+
}
|
|
1469
|
+
if (tokenID in this.tokenConditionMap) {
|
|
1470
|
+
await this.getClobMarketInfo(this.tokenConditionMap[tokenID]);
|
|
1471
|
+
return this.negRisk[tokenID];
|
|
1472
|
+
}
|
|
1473
|
+
const result = await this.get(`${this.host}${GET_NEG_RISK}`, {
|
|
1474
|
+
params: { token_id: tokenID }
|
|
1475
|
+
});
|
|
1476
|
+
this.negRisk[tokenID] = result.neg_risk;
|
|
1477
|
+
return this.negRisk[tokenID];
|
|
1478
|
+
}
|
|
1479
|
+
async getFeeRateBps(tokenID) {
|
|
1480
|
+
if (tokenID in this.feeRates) {
|
|
1481
|
+
return this.feeRates[tokenID];
|
|
1482
|
+
}
|
|
1483
|
+
const result = await this.get(`${this.host}${GET_FEE_RATE}`, {
|
|
1484
|
+
params: { token_id: tokenID }
|
|
1485
|
+
});
|
|
1486
|
+
this.feeRates[tokenID] = result.base_fee;
|
|
1487
|
+
return this.feeRates[tokenID];
|
|
1488
|
+
}
|
|
1489
|
+
async getFeeExponent(tokenID) {
|
|
1490
|
+
if (tokenID in this.feeInfos) {
|
|
1491
|
+
return this.feeInfos[tokenID].exponent;
|
|
1492
|
+
}
|
|
1493
|
+
await this._ensureMarketInfoCached(tokenID);
|
|
1494
|
+
return this.feeInfos[tokenID].exponent;
|
|
1495
|
+
}
|
|
1496
|
+
/**
|
|
1497
|
+
* Calculates the hash for the given orderbook
|
|
1498
|
+
* @param orderbook
|
|
1499
|
+
* @returns
|
|
1500
|
+
*/
|
|
1501
|
+
getOrderBookHash(orderbook) {
|
|
1502
|
+
return generateOrderBookSummaryHash(orderbook);
|
|
1503
|
+
}
|
|
1504
|
+
async getMidpoint(tokenID) {
|
|
1505
|
+
return this.get(`${this.host}${GET_MIDPOINT}`, {
|
|
1506
|
+
params: { token_id: tokenID }
|
|
1507
|
+
});
|
|
1508
|
+
}
|
|
1509
|
+
async getMidpoints(params) {
|
|
1510
|
+
return this.post(`${this.host}${GET_MIDPOINTS}`, {
|
|
1511
|
+
data: params
|
|
1512
|
+
});
|
|
1513
|
+
}
|
|
1514
|
+
async getPrice(tokenID, side) {
|
|
1515
|
+
return this.get(`${this.host}${GET_PRICE}`, {
|
|
1516
|
+
params: { token_id: tokenID, side }
|
|
1517
|
+
});
|
|
1518
|
+
}
|
|
1519
|
+
async getPrices(params) {
|
|
1520
|
+
return this.post(`${this.host}${GET_PRICES}`, {
|
|
1521
|
+
data: params
|
|
1522
|
+
});
|
|
1523
|
+
}
|
|
1524
|
+
async getSpread(tokenID) {
|
|
1525
|
+
return this.get(`${this.host}${GET_SPREAD}`, {
|
|
1526
|
+
params: { token_id: tokenID }
|
|
1527
|
+
});
|
|
1528
|
+
}
|
|
1529
|
+
async getSpreads(params) {
|
|
1530
|
+
return this.post(`${this.host}${GET_SPREADS}`, {
|
|
1531
|
+
data: params
|
|
1532
|
+
});
|
|
1533
|
+
}
|
|
1534
|
+
async getLastTradePrice(tokenID) {
|
|
1535
|
+
return this.get(`${this.host}${GET_LAST_TRADE_PRICE}`, {
|
|
1536
|
+
params: { token_id: tokenID }
|
|
1537
|
+
});
|
|
1538
|
+
}
|
|
1539
|
+
async getLastTradesPrices(params) {
|
|
1540
|
+
return this.post(`${this.host}${GET_LAST_TRADES_PRICES}`, {
|
|
1541
|
+
data: params
|
|
1542
|
+
});
|
|
1543
|
+
}
|
|
1544
|
+
async getPricesHistory(params) {
|
|
1545
|
+
if (!params.interval && (params.startTs === void 0 || params.endTs === void 0)) {
|
|
1546
|
+
throw new Error("getPricesHistory requires either interval or both startTs and endTs");
|
|
1547
|
+
}
|
|
1548
|
+
return this.get(`${this.host}${GET_PRICES_HISTORY}`, {
|
|
1549
|
+
params
|
|
1550
|
+
});
|
|
1551
|
+
}
|
|
1552
|
+
// L1 Authed
|
|
1553
|
+
/**
|
|
1554
|
+
* Creates a new API key for a user
|
|
1555
|
+
* @param nonce
|
|
1556
|
+
* @returns ApiKeyCreds
|
|
1557
|
+
*/
|
|
1558
|
+
async createApiKey(nonce) {
|
|
1559
|
+
this.canL1Auth();
|
|
1560
|
+
const endpoint = `${this.host}${CREATE_API_KEY}`;
|
|
1561
|
+
const headers = await createL1Headers(
|
|
1562
|
+
this.signer,
|
|
1563
|
+
this.chainId,
|
|
1564
|
+
nonce,
|
|
1565
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1566
|
+
);
|
|
1567
|
+
return await this.post(endpoint, { headers }).then((apiKeyRaw) => {
|
|
1568
|
+
const apiKey = {
|
|
1569
|
+
key: apiKeyRaw.apiKey,
|
|
1570
|
+
secret: apiKeyRaw.secret,
|
|
1571
|
+
passphrase: apiKeyRaw.passphrase
|
|
1572
|
+
};
|
|
1573
|
+
return apiKey;
|
|
1574
|
+
});
|
|
1575
|
+
}
|
|
1576
|
+
/**
|
|
1577
|
+
* Derives an existing API key for a user
|
|
1578
|
+
* @param nonce
|
|
1579
|
+
* @returns ApiKeyCreds
|
|
1580
|
+
*/
|
|
1581
|
+
async deriveApiKey(nonce) {
|
|
1582
|
+
this.canL1Auth();
|
|
1583
|
+
const endpoint = `${this.host}${DERIVE_API_KEY}`;
|
|
1584
|
+
const headers = await createL1Headers(
|
|
1585
|
+
this.signer,
|
|
1586
|
+
this.chainId,
|
|
1587
|
+
nonce,
|
|
1588
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1589
|
+
);
|
|
1590
|
+
return await this.get(endpoint, { headers }).then((apiKeyRaw) => {
|
|
1591
|
+
const apiKey = {
|
|
1592
|
+
key: apiKeyRaw.apiKey,
|
|
1593
|
+
secret: apiKeyRaw.secret,
|
|
1594
|
+
passphrase: apiKeyRaw.passphrase
|
|
1595
|
+
};
|
|
1596
|
+
return apiKey;
|
|
1597
|
+
});
|
|
1598
|
+
}
|
|
1599
|
+
async createOrDeriveApiKey(nonce) {
|
|
1600
|
+
return this.createApiKey(nonce).then((response) => {
|
|
1601
|
+
if (!response.key) {
|
|
1602
|
+
return this.deriveApiKey(nonce);
|
|
1603
|
+
}
|
|
1604
|
+
return response;
|
|
1605
|
+
});
|
|
1606
|
+
}
|
|
1607
|
+
async getApiKeys() {
|
|
1608
|
+
this.canL2Auth();
|
|
1609
|
+
const endpoint = GET_API_KEYS;
|
|
1610
|
+
const headerArgs = {
|
|
1611
|
+
method: GET,
|
|
1612
|
+
requestPath: endpoint
|
|
1613
|
+
};
|
|
1614
|
+
const headers = await createL2Headers(
|
|
1615
|
+
this.signer,
|
|
1616
|
+
this.creds,
|
|
1617
|
+
headerArgs,
|
|
1618
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1619
|
+
);
|
|
1620
|
+
return this.get(`${this.host}${endpoint}`, { headers });
|
|
1621
|
+
}
|
|
1622
|
+
async getClosedOnlyMode() {
|
|
1623
|
+
this.canL2Auth();
|
|
1624
|
+
const endpoint = CLOSED_ONLY;
|
|
1625
|
+
const headerArgs = {
|
|
1626
|
+
method: GET,
|
|
1627
|
+
requestPath: endpoint
|
|
1628
|
+
};
|
|
1629
|
+
const headers = await createL2Headers(
|
|
1630
|
+
this.signer,
|
|
1631
|
+
this.creds,
|
|
1632
|
+
headerArgs,
|
|
1633
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1634
|
+
);
|
|
1635
|
+
return this.get(`${this.host}${endpoint}`, { headers });
|
|
1636
|
+
}
|
|
1637
|
+
async deleteApiKey() {
|
|
1638
|
+
this.canL2Auth();
|
|
1639
|
+
const endpoint = DELETE_API_KEY;
|
|
1640
|
+
const headerArgs = {
|
|
1641
|
+
method: DELETE,
|
|
1642
|
+
requestPath: endpoint
|
|
1643
|
+
};
|
|
1644
|
+
const headers = await createL2Headers(
|
|
1645
|
+
this.signer,
|
|
1646
|
+
this.creds,
|
|
1647
|
+
headerArgs,
|
|
1648
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1649
|
+
);
|
|
1650
|
+
return this.del(`${this.host}${endpoint}`, { headers });
|
|
1651
|
+
}
|
|
1652
|
+
async createReadonlyApiKey() {
|
|
1653
|
+
this.canL2Auth();
|
|
1654
|
+
const endpoint = CREATE_READONLY_API_KEY;
|
|
1655
|
+
const headerArgs = {
|
|
1656
|
+
method: POST,
|
|
1657
|
+
requestPath: endpoint
|
|
1658
|
+
};
|
|
1659
|
+
const headers = await createL2Headers(
|
|
1660
|
+
this.signer,
|
|
1661
|
+
this.creds,
|
|
1662
|
+
headerArgs,
|
|
1663
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1664
|
+
);
|
|
1665
|
+
return this.post(`${this.host}${endpoint}`, { headers });
|
|
1666
|
+
}
|
|
1667
|
+
async getReadonlyApiKeys() {
|
|
1668
|
+
this.canL2Auth();
|
|
1669
|
+
const endpoint = GET_READONLY_API_KEYS;
|
|
1670
|
+
const headerArgs = {
|
|
1671
|
+
method: GET,
|
|
1672
|
+
requestPath: endpoint
|
|
1673
|
+
};
|
|
1674
|
+
const headers = await createL2Headers(
|
|
1675
|
+
this.signer,
|
|
1676
|
+
this.creds,
|
|
1677
|
+
headerArgs,
|
|
1678
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1679
|
+
);
|
|
1680
|
+
return this.get(`${this.host}${endpoint}`, { headers });
|
|
1681
|
+
}
|
|
1682
|
+
async deleteReadonlyApiKey(key) {
|
|
1683
|
+
this.canL2Auth();
|
|
1684
|
+
const endpoint = DELETE_READONLY_API_KEY;
|
|
1685
|
+
const payload = { key };
|
|
1686
|
+
const headerArgs = {
|
|
1687
|
+
method: DELETE,
|
|
1688
|
+
requestPath: endpoint,
|
|
1689
|
+
body: JSON.stringify(payload)
|
|
1690
|
+
};
|
|
1691
|
+
const headers = await createL2Headers(
|
|
1692
|
+
this.signer,
|
|
1693
|
+
this.creds,
|
|
1694
|
+
headerArgs,
|
|
1695
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1696
|
+
);
|
|
1697
|
+
return this.del(`${this.host}${endpoint}`, { headers, data: payload });
|
|
1698
|
+
}
|
|
1699
|
+
async getOrder(orderID) {
|
|
1700
|
+
this.canL2Auth();
|
|
1701
|
+
const endpoint = `${GET_ORDER}${orderID}`;
|
|
1702
|
+
const headerArgs = {
|
|
1703
|
+
method: GET,
|
|
1704
|
+
requestPath: endpoint
|
|
1705
|
+
};
|
|
1706
|
+
const headers = await createL2Headers(
|
|
1707
|
+
this.signer,
|
|
1708
|
+
this.creds,
|
|
1709
|
+
headerArgs,
|
|
1710
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1711
|
+
);
|
|
1712
|
+
return this.get(`${this.host}${endpoint}`, { headers });
|
|
1713
|
+
}
|
|
1714
|
+
async getTrades(params, only_first_page = false, next_cursor) {
|
|
1715
|
+
this.canL2Auth();
|
|
1716
|
+
const endpoint = GET_TRADES;
|
|
1717
|
+
const headerArgs = {
|
|
1718
|
+
method: GET,
|
|
1719
|
+
requestPath: endpoint
|
|
1720
|
+
};
|
|
1721
|
+
const headers = await createL2Headers(
|
|
1722
|
+
this.signer,
|
|
1723
|
+
this.creds,
|
|
1724
|
+
headerArgs,
|
|
1725
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1726
|
+
);
|
|
1727
|
+
let results = [];
|
|
1728
|
+
next_cursor = next_cursor || INITIAL_CURSOR;
|
|
1729
|
+
while (next_cursor !== END_CURSOR && (next_cursor === INITIAL_CURSOR || !only_first_page)) {
|
|
1730
|
+
const _params = {
|
|
1731
|
+
...params,
|
|
1732
|
+
next_cursor
|
|
1733
|
+
};
|
|
1734
|
+
const response = await this.get(`${this.host}${endpoint}`, {
|
|
1735
|
+
headers,
|
|
1736
|
+
params: _params
|
|
1737
|
+
});
|
|
1738
|
+
next_cursor = response.next_cursor;
|
|
1739
|
+
results = [...results, ...response.data];
|
|
1740
|
+
}
|
|
1741
|
+
return results;
|
|
1742
|
+
}
|
|
1743
|
+
async getTradesPaginated(params, next_cursor) {
|
|
1744
|
+
this.canL2Auth();
|
|
1745
|
+
const endpoint = GET_TRADES;
|
|
1746
|
+
const headerArgs = {
|
|
1747
|
+
method: GET,
|
|
1748
|
+
requestPath: endpoint
|
|
1749
|
+
};
|
|
1750
|
+
const headers = await createL2Headers(
|
|
1751
|
+
this.signer,
|
|
1752
|
+
this.creds,
|
|
1753
|
+
headerArgs,
|
|
1754
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1755
|
+
);
|
|
1756
|
+
next_cursor = next_cursor || INITIAL_CURSOR;
|
|
1757
|
+
const _params = { ...params, next_cursor };
|
|
1758
|
+
const {
|
|
1759
|
+
data,
|
|
1760
|
+
...rest
|
|
1761
|
+
} = await this.get(
|
|
1762
|
+
`${this.host}${endpoint}`,
|
|
1763
|
+
{ headers, params: _params }
|
|
1764
|
+
);
|
|
1765
|
+
return { trades: Array.isArray(data) ? [...data] : [], ...rest };
|
|
1766
|
+
}
|
|
1767
|
+
async getBuilderTrades(params, next_cursor) {
|
|
1768
|
+
if (!params.builder_code || params.builder_code === bytes32Zero) {
|
|
1769
|
+
throw new Error("builderCode is required and cannot be zero");
|
|
1770
|
+
}
|
|
1771
|
+
this.canL2Auth();
|
|
1772
|
+
const endpoint = GET_BUILDER_TRADES;
|
|
1773
|
+
const headerArgs = {
|
|
1774
|
+
method: GET,
|
|
1775
|
+
requestPath: endpoint
|
|
1776
|
+
};
|
|
1777
|
+
const headers = await createL2Headers(
|
|
1778
|
+
this.signer,
|
|
1779
|
+
this.creds,
|
|
1780
|
+
headerArgs,
|
|
1781
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1782
|
+
);
|
|
1783
|
+
next_cursor = next_cursor || INITIAL_CURSOR;
|
|
1784
|
+
const _params = { ...params, next_cursor };
|
|
1785
|
+
const {
|
|
1786
|
+
data,
|
|
1787
|
+
...rest
|
|
1788
|
+
} = await this.get(`${this.host}${endpoint}`, { headers, params: _params });
|
|
1789
|
+
return { trades: Array.isArray(data) ? [...data] : [], ...rest };
|
|
1790
|
+
}
|
|
1791
|
+
async getNotifications() {
|
|
1792
|
+
this.canL2Auth();
|
|
1793
|
+
const endpoint = GET_NOTIFICATIONS;
|
|
1794
|
+
const headerArgs = {
|
|
1795
|
+
method: GET,
|
|
1796
|
+
requestPath: endpoint
|
|
1797
|
+
};
|
|
1798
|
+
const headers = await createL2Headers(
|
|
1799
|
+
this.signer,
|
|
1800
|
+
this.creds,
|
|
1801
|
+
headerArgs,
|
|
1802
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1803
|
+
);
|
|
1804
|
+
return this.get(`${this.host}${endpoint}`, {
|
|
1805
|
+
headers,
|
|
1806
|
+
params: { signature_type: this.orderBuilder.signatureType }
|
|
1807
|
+
});
|
|
1808
|
+
}
|
|
1809
|
+
async dropNotifications(params) {
|
|
1810
|
+
this.canL2Auth();
|
|
1811
|
+
const endpoint = DROP_NOTIFICATIONS;
|
|
1812
|
+
const l2HeaderArgs = {
|
|
1813
|
+
method: DELETE,
|
|
1814
|
+
requestPath: endpoint
|
|
1815
|
+
};
|
|
1816
|
+
const headers = await createL2Headers(
|
|
1817
|
+
this.signer,
|
|
1818
|
+
this.creds,
|
|
1819
|
+
l2HeaderArgs,
|
|
1820
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1821
|
+
);
|
|
1822
|
+
return this.del(`${this.host}${endpoint}`, {
|
|
1823
|
+
headers,
|
|
1824
|
+
params: parseDropNotificationParams(params)
|
|
1825
|
+
});
|
|
1826
|
+
}
|
|
1827
|
+
async getBalanceAllowance(params) {
|
|
1828
|
+
this.canL2Auth();
|
|
1829
|
+
const endpoint = GET_BALANCE_ALLOWANCE;
|
|
1830
|
+
const headerArgs = {
|
|
1831
|
+
method: GET,
|
|
1832
|
+
requestPath: endpoint
|
|
1833
|
+
};
|
|
1834
|
+
const headers = await createL2Headers(
|
|
1835
|
+
this.signer,
|
|
1836
|
+
this.creds,
|
|
1837
|
+
headerArgs,
|
|
1838
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1839
|
+
);
|
|
1840
|
+
const _params = {
|
|
1841
|
+
...params,
|
|
1842
|
+
signature_type: this.orderBuilder.signatureType
|
|
1843
|
+
};
|
|
1844
|
+
return this.get(`${this.host}${endpoint}`, { headers, params: _params });
|
|
1845
|
+
}
|
|
1846
|
+
async updateBalanceAllowance(params) {
|
|
1847
|
+
this.canL2Auth();
|
|
1848
|
+
const endpoint = UPDATE_BALANCE_ALLOWANCE;
|
|
1849
|
+
const headerArgs = {
|
|
1850
|
+
method: GET,
|
|
1851
|
+
requestPath: endpoint
|
|
1852
|
+
};
|
|
1853
|
+
const headers = await createL2Headers(
|
|
1854
|
+
this.signer,
|
|
1855
|
+
this.creds,
|
|
1856
|
+
headerArgs,
|
|
1857
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1858
|
+
);
|
|
1859
|
+
const _params = {
|
|
1860
|
+
...params,
|
|
1861
|
+
signature_type: this.orderBuilder.signatureType
|
|
1862
|
+
};
|
|
1863
|
+
return this.get(`${this.host}${endpoint}`, { headers, params: _params });
|
|
1864
|
+
}
|
|
1865
|
+
async createOrder(userOrder, options) {
|
|
1866
|
+
this.canL1Auth();
|
|
1867
|
+
const orderToSign = { ...userOrder };
|
|
1868
|
+
if (this.builderConfig?.builderCode && !orderToSign.builderCode) {
|
|
1869
|
+
orderToSign.builderCode = this.builderConfig.builderCode;
|
|
1870
|
+
}
|
|
1871
|
+
const { tokenID } = orderToSign;
|
|
1872
|
+
const tickSize = await this._resolveTickSize(tokenID, options?.tickSize);
|
|
1873
|
+
if (!priceValid(orderToSign.price, tickSize)) {
|
|
1874
|
+
throw new Error(
|
|
1875
|
+
`invalid price (${orderToSign.price}), min: ${parseFloat(tickSize)} - max: ${1 - parseFloat(tickSize)}`
|
|
1876
|
+
);
|
|
1877
|
+
}
|
|
1878
|
+
const negRisk = options?.negRisk ?? await this.getNegRisk(tokenID);
|
|
1879
|
+
const version = await this.resolveVersion();
|
|
1880
|
+
if (version === 1) {
|
|
1881
|
+
const userFeeRateBps = "feeRateBps" in orderToSign ? orderToSign.feeRateBps : void 0;
|
|
1882
|
+
const feeRateBps = await this._resolveFeeRateBps(tokenID, userFeeRateBps);
|
|
1883
|
+
orderToSign.feeRateBps = feeRateBps;
|
|
1884
|
+
}
|
|
1885
|
+
return this.orderBuilder.buildOrder(
|
|
1886
|
+
orderToSign,
|
|
1887
|
+
{
|
|
1888
|
+
tickSize,
|
|
1889
|
+
negRisk
|
|
1890
|
+
},
|
|
1891
|
+
version
|
|
1892
|
+
);
|
|
1893
|
+
}
|
|
1894
|
+
async createMarketOrder(userMarketOrder, options) {
|
|
1895
|
+
this.canL1Auth();
|
|
1896
|
+
const { tokenID } = userMarketOrder;
|
|
1897
|
+
await this._ensureMarketInfoCached(tokenID);
|
|
1898
|
+
const tickSize = await this._resolveTickSize(tokenID, options?.tickSize);
|
|
1899
|
+
if (!userMarketOrder.price) {
|
|
1900
|
+
userMarketOrder.price = await this.calculateMarketPrice(
|
|
1901
|
+
tokenID,
|
|
1902
|
+
userMarketOrder.side,
|
|
1903
|
+
userMarketOrder.amount,
|
|
1904
|
+
userMarketOrder.orderType
|
|
1905
|
+
);
|
|
1906
|
+
}
|
|
1907
|
+
if (!priceValid(userMarketOrder.price, tickSize)) {
|
|
1908
|
+
throw new Error(
|
|
1909
|
+
`invalid price (${userMarketOrder.price}), min: ${parseFloat(tickSize)} - max: ${1 - parseFloat(tickSize)}`
|
|
1910
|
+
);
|
|
1911
|
+
}
|
|
1912
|
+
const orderToSign = { ...userMarketOrder };
|
|
1913
|
+
if (this.builderConfig?.builderCode && !orderToSign.builderCode) {
|
|
1914
|
+
orderToSign.builderCode = this.builderConfig.builderCode;
|
|
1915
|
+
}
|
|
1916
|
+
await this.ensureBuilderFeeRateCached(orderToSign.builderCode);
|
|
1917
|
+
if (orderToSign.side === "BUY" /* BUY */ && "userUSDCBalance" in orderToSign && orderToSign.userUSDCBalance !== void 0) {
|
|
1918
|
+
const price = orderToSign.price;
|
|
1919
|
+
const { userUSDCBalance } = orderToSign;
|
|
1920
|
+
const builderTakerFeeRate = this.isBuilderOrder(orderToSign.builderCode) ? this.builderFeeRates[orderToSign.builderCode ?? ""]?.taker ?? 0 : 0;
|
|
1921
|
+
orderToSign.amount = adjustBuyAmountForFees(
|
|
1922
|
+
orderToSign.amount,
|
|
1923
|
+
price,
|
|
1924
|
+
userUSDCBalance,
|
|
1925
|
+
this.feeInfos[tokenID].rate,
|
|
1926
|
+
this.feeInfos[tokenID].exponent,
|
|
1927
|
+
builderTakerFeeRate
|
|
1928
|
+
);
|
|
1929
|
+
}
|
|
1930
|
+
const negRisk = options?.negRisk ?? await this.getNegRisk(tokenID);
|
|
1931
|
+
const version = await this.resolveVersion();
|
|
1932
|
+
if (version === 1) {
|
|
1933
|
+
const userFeeRateBps = "feeRateBps" in orderToSign ? orderToSign.feeRateBps : void 0;
|
|
1934
|
+
const feeRateBps = await this._resolveFeeRateBps(tokenID, userFeeRateBps);
|
|
1935
|
+
orderToSign.feeRateBps = feeRateBps;
|
|
1936
|
+
}
|
|
1937
|
+
return this.orderBuilder.buildMarketOrder(
|
|
1938
|
+
orderToSign,
|
|
1939
|
+
{
|
|
1940
|
+
tickSize,
|
|
1941
|
+
negRisk
|
|
1942
|
+
},
|
|
1943
|
+
version
|
|
1944
|
+
);
|
|
1945
|
+
}
|
|
1946
|
+
async createAndPostOrder(userOrder, options, orderType = "GTC" /* GTC */, postOnly = false, deferExec = false) {
|
|
1947
|
+
let postOrderResponse;
|
|
1948
|
+
await this._retryOnVersionUpdate(async () => {
|
|
1949
|
+
const order = await this.createOrder(userOrder, options);
|
|
1950
|
+
postOrderResponse = await this.postOrder(order, orderType, postOnly, deferExec);
|
|
1951
|
+
});
|
|
1952
|
+
return postOrderResponse;
|
|
1953
|
+
}
|
|
1954
|
+
async createAndPostMarketOrder(userMarketOrder, options, orderType = "FOK" /* FOK */, deferExec = false) {
|
|
1955
|
+
let postOrderMarketResponse;
|
|
1956
|
+
await this._retryOnVersionUpdate(async () => {
|
|
1957
|
+
const order = await this.createMarketOrder(userMarketOrder, options);
|
|
1958
|
+
postOrderMarketResponse = await this.postOrder(order, orderType, false, deferExec);
|
|
1959
|
+
});
|
|
1960
|
+
return postOrderMarketResponse;
|
|
1961
|
+
}
|
|
1962
|
+
async getOpenOrders(params, only_first_page = false, next_cursor) {
|
|
1963
|
+
this.canL2Auth();
|
|
1964
|
+
const endpoint = GET_OPEN_ORDERS;
|
|
1965
|
+
const l2HeaderArgs = {
|
|
1966
|
+
method: GET,
|
|
1967
|
+
requestPath: endpoint
|
|
1968
|
+
};
|
|
1969
|
+
const headers = await createL2Headers(
|
|
1970
|
+
this.signer,
|
|
1971
|
+
this.creds,
|
|
1972
|
+
l2HeaderArgs,
|
|
1973
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
1974
|
+
);
|
|
1975
|
+
let results = [];
|
|
1976
|
+
next_cursor = next_cursor || INITIAL_CURSOR;
|
|
1977
|
+
while (next_cursor !== END_CURSOR && (next_cursor === INITIAL_CURSOR || !only_first_page)) {
|
|
1978
|
+
const _params = {
|
|
1979
|
+
...params,
|
|
1980
|
+
next_cursor
|
|
1981
|
+
};
|
|
1982
|
+
const response = await this.get(`${this.host}${endpoint}`, {
|
|
1983
|
+
headers,
|
|
1984
|
+
params: _params
|
|
1985
|
+
});
|
|
1986
|
+
next_cursor = response.next_cursor;
|
|
1987
|
+
results = [...results, ...response.data];
|
|
1988
|
+
}
|
|
1989
|
+
return results;
|
|
1990
|
+
}
|
|
1991
|
+
async getPreMigrationOrders(only_first_page = false, next_cursor) {
|
|
1992
|
+
this.canL2Auth();
|
|
1993
|
+
const endpoint = GET_PRE_MIGRATION_ORDERS;
|
|
1994
|
+
const l2HeaderArgs = {
|
|
1995
|
+
method: GET,
|
|
1996
|
+
requestPath: endpoint
|
|
1997
|
+
};
|
|
1998
|
+
const headers = await createL2Headers(
|
|
1999
|
+
this.signer,
|
|
2000
|
+
this.creds,
|
|
2001
|
+
l2HeaderArgs,
|
|
2002
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2003
|
+
);
|
|
2004
|
+
let results = [];
|
|
2005
|
+
next_cursor = next_cursor || INITIAL_CURSOR;
|
|
2006
|
+
while (next_cursor !== END_CURSOR && (next_cursor === INITIAL_CURSOR || !only_first_page)) {
|
|
2007
|
+
const _params = { next_cursor };
|
|
2008
|
+
const response = await this.get(`${this.host}${endpoint}`, {
|
|
2009
|
+
headers,
|
|
2010
|
+
params: _params
|
|
2011
|
+
});
|
|
2012
|
+
next_cursor = response.next_cursor;
|
|
2013
|
+
results = [...results, ...response.data];
|
|
2014
|
+
}
|
|
2015
|
+
return results;
|
|
2016
|
+
}
|
|
2017
|
+
async postOrder(order, orderType = "GTC" /* GTC */, postOnly = false, deferExec = false) {
|
|
2018
|
+
this.canL2Auth();
|
|
2019
|
+
if (postOnly && (orderType === "FOK" /* FOK */ || orderType === "FAK" /* FAK */)) {
|
|
2020
|
+
throw new Error("postOnly is not supported for FOK/FAK orders");
|
|
2021
|
+
}
|
|
2022
|
+
const endpoint = POST_ORDER;
|
|
2023
|
+
const orderPayload = isV2Order(order) ? orderToJsonV2(order, this.creds?.key || "", orderType, postOnly, deferExec) : orderToJsonV1(order, this.creds?.key || "", orderType, postOnly, deferExec);
|
|
2024
|
+
const l2HeaderArgs = {
|
|
2025
|
+
method: POST,
|
|
2026
|
+
requestPath: endpoint,
|
|
2027
|
+
body: JSON.stringify(orderPayload)
|
|
2028
|
+
};
|
|
2029
|
+
const headers = await createL2Headers(
|
|
2030
|
+
this.signer,
|
|
2031
|
+
this.creds,
|
|
2032
|
+
l2HeaderArgs,
|
|
2033
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2034
|
+
);
|
|
2035
|
+
const res = await this.post(
|
|
2036
|
+
`${this.host}${endpoint}`,
|
|
2037
|
+
{
|
|
2038
|
+
headers,
|
|
2039
|
+
data: orderPayload
|
|
2040
|
+
},
|
|
2041
|
+
true
|
|
2042
|
+
);
|
|
2043
|
+
if (this._isOrderVersionMismatch(res)) await this.resolveVersion(true);
|
|
2044
|
+
return this.throwIfError(res);
|
|
2045
|
+
}
|
|
2046
|
+
async postOrders(args, postOnly = false, deferExec = false) {
|
|
2047
|
+
this.canL2Auth();
|
|
2048
|
+
if (postOnly && args.some(({ orderType }) => orderType === "FOK" /* FOK */ || orderType === "FAK" /* FAK */)) {
|
|
2049
|
+
throw new Error("postOnly is not supported for FOK/FAK orders");
|
|
2050
|
+
}
|
|
2051
|
+
const endpoint = POST_ORDERS;
|
|
2052
|
+
const ordersPayload = [];
|
|
2053
|
+
for (const arg of args) {
|
|
2054
|
+
const { order, orderType } = arg;
|
|
2055
|
+
const orderPayload = isV2Order(order) ? orderToJsonV2(order, this.creds?.key || "", orderType, postOnly, deferExec) : orderToJsonV1(order, this.creds?.key || "", orderType, postOnly, deferExec);
|
|
2056
|
+
ordersPayload.push(orderPayload);
|
|
2057
|
+
}
|
|
2058
|
+
const l2HeaderArgs = {
|
|
2059
|
+
method: POST,
|
|
2060
|
+
requestPath: endpoint,
|
|
2061
|
+
body: JSON.stringify(ordersPayload)
|
|
2062
|
+
};
|
|
2063
|
+
const headers = await createL2Headers(
|
|
2064
|
+
this.signer,
|
|
2065
|
+
this.creds,
|
|
2066
|
+
l2HeaderArgs,
|
|
2067
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2068
|
+
);
|
|
2069
|
+
const res = await this.post(
|
|
2070
|
+
`${this.host}${endpoint}`,
|
|
2071
|
+
{
|
|
2072
|
+
headers,
|
|
2073
|
+
data: ordersPayload
|
|
2074
|
+
},
|
|
2075
|
+
true
|
|
2076
|
+
);
|
|
2077
|
+
if (this._isOrderVersionMismatch(res)) await this.resolveVersion(true);
|
|
2078
|
+
return this.throwIfError(res);
|
|
2079
|
+
}
|
|
2080
|
+
async cancelOrder(payload) {
|
|
2081
|
+
this.canL2Auth();
|
|
2082
|
+
const endpoint = CANCEL_ORDER;
|
|
2083
|
+
const l2HeaderArgs = {
|
|
2084
|
+
method: DELETE,
|
|
2085
|
+
requestPath: endpoint,
|
|
2086
|
+
body: JSON.stringify(payload)
|
|
2087
|
+
};
|
|
2088
|
+
const headers = await createL2Headers(
|
|
2089
|
+
this.signer,
|
|
2090
|
+
this.creds,
|
|
2091
|
+
l2HeaderArgs,
|
|
2092
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2093
|
+
);
|
|
2094
|
+
return this.del(`${this.host}${endpoint}`, { headers, data: payload });
|
|
2095
|
+
}
|
|
2096
|
+
async cancelOrders(ordersHashes) {
|
|
2097
|
+
this.canL2Auth();
|
|
2098
|
+
const endpoint = CANCEL_ORDERS;
|
|
2099
|
+
const l2HeaderArgs = {
|
|
2100
|
+
method: DELETE,
|
|
2101
|
+
requestPath: endpoint,
|
|
2102
|
+
body: JSON.stringify(ordersHashes)
|
|
2103
|
+
};
|
|
2104
|
+
const headers = await createL2Headers(
|
|
2105
|
+
this.signer,
|
|
2106
|
+
this.creds,
|
|
2107
|
+
l2HeaderArgs,
|
|
2108
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2109
|
+
);
|
|
2110
|
+
return this.del(`${this.host}${endpoint}`, { headers, data: ordersHashes });
|
|
2111
|
+
}
|
|
2112
|
+
async cancelAll() {
|
|
2113
|
+
this.canL2Auth();
|
|
2114
|
+
const endpoint = CANCEL_ALL;
|
|
2115
|
+
const l2HeaderArgs = {
|
|
2116
|
+
method: DELETE,
|
|
2117
|
+
requestPath: endpoint
|
|
2118
|
+
};
|
|
2119
|
+
const headers = await createL2Headers(
|
|
2120
|
+
this.signer,
|
|
2121
|
+
this.creds,
|
|
2122
|
+
l2HeaderArgs,
|
|
2123
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2124
|
+
);
|
|
2125
|
+
return this.del(`${this.host}${endpoint}`, { headers });
|
|
2126
|
+
}
|
|
2127
|
+
async cancelMarketOrders(payload) {
|
|
2128
|
+
this.canL2Auth();
|
|
2129
|
+
const endpoint = CANCEL_MARKET_ORDERS;
|
|
2130
|
+
const l2HeaderArgs = {
|
|
2131
|
+
method: DELETE,
|
|
2132
|
+
requestPath: endpoint,
|
|
2133
|
+
body: JSON.stringify(payload)
|
|
2134
|
+
};
|
|
2135
|
+
const headers = await createL2Headers(
|
|
2136
|
+
this.signer,
|
|
2137
|
+
this.creds,
|
|
2138
|
+
l2HeaderArgs,
|
|
2139
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2140
|
+
);
|
|
2141
|
+
return this.del(`${this.host}${endpoint}`, { headers, data: payload });
|
|
2142
|
+
}
|
|
2143
|
+
async isOrderScoring(params) {
|
|
2144
|
+
this.canL2Auth();
|
|
2145
|
+
const endpoint = IS_ORDER_SCORING;
|
|
2146
|
+
const headerArgs = {
|
|
2147
|
+
method: GET,
|
|
2148
|
+
requestPath: endpoint
|
|
2149
|
+
};
|
|
2150
|
+
const headers = await createL2Headers(
|
|
2151
|
+
this.signer,
|
|
2152
|
+
this.creds,
|
|
2153
|
+
headerArgs,
|
|
2154
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2155
|
+
);
|
|
2156
|
+
return this.get(`${this.host}${endpoint}`, { headers, params });
|
|
2157
|
+
}
|
|
2158
|
+
async areOrdersScoring(params) {
|
|
2159
|
+
this.canL2Auth();
|
|
2160
|
+
const endpoint = ARE_ORDERS_SCORING;
|
|
2161
|
+
const payload = JSON.stringify(params?.orderIds);
|
|
2162
|
+
const headerArgs = {
|
|
2163
|
+
method: POST,
|
|
2164
|
+
requestPath: endpoint,
|
|
2165
|
+
body: payload
|
|
2166
|
+
};
|
|
2167
|
+
const headers = await createL2Headers(
|
|
2168
|
+
this.signer,
|
|
2169
|
+
this.creds,
|
|
2170
|
+
headerArgs,
|
|
2171
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2172
|
+
);
|
|
2173
|
+
return this.post(`${this.host}${endpoint}`, {
|
|
2174
|
+
headers,
|
|
2175
|
+
data: payload
|
|
2176
|
+
});
|
|
2177
|
+
}
|
|
2178
|
+
// Rewards
|
|
2179
|
+
async getEarningsForUserForDay(date) {
|
|
2180
|
+
this.canL2Auth();
|
|
2181
|
+
const endpoint = GET_EARNINGS_FOR_USER_FOR_DAY;
|
|
2182
|
+
const headerArgs = {
|
|
2183
|
+
method: GET,
|
|
2184
|
+
requestPath: endpoint
|
|
2185
|
+
};
|
|
2186
|
+
const headers = await createL2Headers(
|
|
2187
|
+
this.signer,
|
|
2188
|
+
this.creds,
|
|
2189
|
+
headerArgs,
|
|
2190
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2191
|
+
);
|
|
2192
|
+
let results = [];
|
|
2193
|
+
let next_cursor = INITIAL_CURSOR;
|
|
2194
|
+
while (next_cursor !== END_CURSOR) {
|
|
2195
|
+
const params = {
|
|
2196
|
+
date,
|
|
2197
|
+
signature_type: this.orderBuilder.signatureType,
|
|
2198
|
+
next_cursor
|
|
2199
|
+
};
|
|
2200
|
+
const response = await this.get(`${this.host}${endpoint}`, {
|
|
2201
|
+
headers,
|
|
2202
|
+
params
|
|
2203
|
+
});
|
|
2204
|
+
next_cursor = response.next_cursor;
|
|
2205
|
+
results = [...results, ...response.data];
|
|
2206
|
+
}
|
|
2207
|
+
return results;
|
|
2208
|
+
}
|
|
2209
|
+
async getTotalEarningsForUserForDay(date) {
|
|
2210
|
+
this.canL2Auth();
|
|
2211
|
+
const endpoint = GET_TOTAL_EARNINGS_FOR_USER_FOR_DAY;
|
|
2212
|
+
const headerArgs = {
|
|
2213
|
+
method: GET,
|
|
2214
|
+
requestPath: endpoint
|
|
2215
|
+
};
|
|
2216
|
+
const headers = await createL2Headers(
|
|
2217
|
+
this.signer,
|
|
2218
|
+
this.creds,
|
|
2219
|
+
headerArgs,
|
|
2220
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2221
|
+
);
|
|
2222
|
+
const params = {
|
|
2223
|
+
date,
|
|
2224
|
+
signature_type: this.orderBuilder.signatureType
|
|
2225
|
+
};
|
|
2226
|
+
return await this.get(`${this.host}${endpoint}`, {
|
|
2227
|
+
headers,
|
|
2228
|
+
params
|
|
2229
|
+
});
|
|
2230
|
+
}
|
|
2231
|
+
async getUserEarningsAndMarketsConfig(date, order_by = "", position = "", no_competition = false) {
|
|
2232
|
+
this.canL2Auth();
|
|
2233
|
+
const endpoint = GET_REWARDS_EARNINGS_PERCENTAGES;
|
|
2234
|
+
const headerArgs = {
|
|
2235
|
+
method: GET,
|
|
2236
|
+
requestPath: endpoint
|
|
2237
|
+
};
|
|
2238
|
+
const headers = await createL2Headers(
|
|
2239
|
+
this.signer,
|
|
2240
|
+
this.creds,
|
|
2241
|
+
headerArgs,
|
|
2242
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2243
|
+
);
|
|
2244
|
+
let results = [];
|
|
2245
|
+
let next_cursor = INITIAL_CURSOR;
|
|
2246
|
+
while (next_cursor !== END_CURSOR) {
|
|
2247
|
+
const params = {
|
|
2248
|
+
date,
|
|
2249
|
+
signature_type: this.orderBuilder.signatureType,
|
|
2250
|
+
next_cursor,
|
|
2251
|
+
order_by,
|
|
2252
|
+
position,
|
|
2253
|
+
no_competition
|
|
2254
|
+
};
|
|
2255
|
+
const response = await this.get(`${this.host}${endpoint}`, {
|
|
2256
|
+
headers,
|
|
2257
|
+
params
|
|
2258
|
+
});
|
|
2259
|
+
next_cursor = response.next_cursor;
|
|
2260
|
+
results = [...results, ...response.data];
|
|
2261
|
+
}
|
|
2262
|
+
return results;
|
|
2263
|
+
}
|
|
2264
|
+
async getRewardPercentages() {
|
|
2265
|
+
this.canL2Auth();
|
|
2266
|
+
const endpoint = GET_LIQUIDITY_REWARD_PERCENTAGES;
|
|
2267
|
+
const headerArgs = {
|
|
2268
|
+
method: GET,
|
|
2269
|
+
requestPath: endpoint
|
|
2270
|
+
};
|
|
2271
|
+
const headers = await createL2Headers(
|
|
2272
|
+
this.signer,
|
|
2273
|
+
this.creds,
|
|
2274
|
+
headerArgs,
|
|
2275
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2276
|
+
);
|
|
2277
|
+
const _params = {
|
|
2278
|
+
signature_type: this.orderBuilder.signatureType
|
|
2279
|
+
};
|
|
2280
|
+
return this.get(`${this.host}${endpoint}`, { headers, params: _params });
|
|
2281
|
+
}
|
|
2282
|
+
async getCurrentRewards() {
|
|
2283
|
+
let results = [];
|
|
2284
|
+
let next_cursor = INITIAL_CURSOR;
|
|
2285
|
+
while (next_cursor !== END_CURSOR) {
|
|
2286
|
+
const response = await this.get(`${this.host}${GET_REWARDS_MARKETS_CURRENT}`, {
|
|
2287
|
+
params: { next_cursor }
|
|
2288
|
+
});
|
|
2289
|
+
next_cursor = response.next_cursor;
|
|
2290
|
+
results = [...results, ...response.data];
|
|
2291
|
+
}
|
|
2292
|
+
return results;
|
|
2293
|
+
}
|
|
2294
|
+
async getRawRewardsForMarket(conditionId) {
|
|
2295
|
+
let results = [];
|
|
2296
|
+
let next_cursor = INITIAL_CURSOR;
|
|
2297
|
+
while (next_cursor !== END_CURSOR) {
|
|
2298
|
+
const response = await this.get(`${this.host}${GET_REWARDS_MARKETS}${conditionId}`, {
|
|
2299
|
+
params: { next_cursor }
|
|
2300
|
+
});
|
|
2301
|
+
next_cursor = response.next_cursor;
|
|
2302
|
+
results = [...results, ...response.data];
|
|
2303
|
+
}
|
|
2304
|
+
return results;
|
|
2305
|
+
}
|
|
2306
|
+
async calculateMarketPrice(tokenID, side, amount, orderType = "FOK" /* FOK */) {
|
|
2307
|
+
const book = await this.getOrderBook(tokenID);
|
|
2308
|
+
if (!book) {
|
|
2309
|
+
throw new Error("no orderbook");
|
|
2310
|
+
}
|
|
2311
|
+
if (side === "BUY" /* BUY */) {
|
|
2312
|
+
if (!book.asks) {
|
|
2313
|
+
throw new Error("no match");
|
|
2314
|
+
}
|
|
2315
|
+
return calculateBuyMarketPrice(book.asks, amount, orderType);
|
|
2316
|
+
} else {
|
|
2317
|
+
if (!book.bids) {
|
|
2318
|
+
throw new Error("no match");
|
|
2319
|
+
}
|
|
2320
|
+
return calculateSellMarketPrice(book.bids, amount, orderType);
|
|
2321
|
+
}
|
|
2322
|
+
}
|
|
2323
|
+
async createBuilderApiKey() {
|
|
2324
|
+
this.canL2Auth();
|
|
2325
|
+
const endpoint = CREATE_BUILDER_API_KEY;
|
|
2326
|
+
const headerArgs = {
|
|
2327
|
+
method: POST,
|
|
2328
|
+
requestPath: endpoint
|
|
2329
|
+
};
|
|
2330
|
+
const headers = await createL2Headers(
|
|
2331
|
+
this.signer,
|
|
2332
|
+
this.creds,
|
|
2333
|
+
headerArgs,
|
|
2334
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2335
|
+
);
|
|
2336
|
+
return this.post(`${this.host}${endpoint}`, { headers });
|
|
2337
|
+
}
|
|
2338
|
+
async getBuilderApiKeys() {
|
|
2339
|
+
this.canL2Auth();
|
|
2340
|
+
const endpoint = GET_BUILDER_API_KEYS;
|
|
2341
|
+
const headerArgs = {
|
|
2342
|
+
method: GET,
|
|
2343
|
+
requestPath: endpoint
|
|
2344
|
+
};
|
|
2345
|
+
const headers = await createL2Headers(
|
|
2346
|
+
this.signer,
|
|
2347
|
+
this.creds,
|
|
2348
|
+
headerArgs,
|
|
2349
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2350
|
+
);
|
|
2351
|
+
return this.get(`${this.host}${endpoint}`, { headers });
|
|
2352
|
+
}
|
|
2353
|
+
async revokeBuilderApiKey() {
|
|
2354
|
+
this.canL2Auth();
|
|
2355
|
+
const endpoint = REVOKE_BUILDER_API_KEY;
|
|
2356
|
+
const headerArgs = {
|
|
2357
|
+
method: DELETE,
|
|
2358
|
+
requestPath: endpoint
|
|
2359
|
+
};
|
|
2360
|
+
const headers = await createL2Headers(
|
|
2361
|
+
this.signer,
|
|
2362
|
+
this.creds,
|
|
2363
|
+
headerArgs,
|
|
2364
|
+
this.useServerTime ? await this.getServerTime() : void 0
|
|
2365
|
+
);
|
|
2366
|
+
return this.del(`${this.host}${endpoint}`, { headers });
|
|
2367
|
+
}
|
|
2368
|
+
async getMarketTradesEvents(conditionID) {
|
|
2369
|
+
return this.get(`${this.host}${GET_MARKET_TRADES_EVENTS}${conditionID}`);
|
|
2370
|
+
}
|
|
2371
|
+
canL1Auth() {
|
|
2372
|
+
if (this.signer === void 0) {
|
|
2373
|
+
throw L1_AUTH_UNAVAILABLE_ERROR;
|
|
2374
|
+
}
|
|
2375
|
+
}
|
|
2376
|
+
canL2Auth() {
|
|
2377
|
+
if (this.signer === void 0) {
|
|
2378
|
+
throw L1_AUTH_UNAVAILABLE_ERROR;
|
|
2379
|
+
}
|
|
2380
|
+
if (this.creds === void 0) {
|
|
2381
|
+
throw L2_AUTH_NOT_AVAILABLE;
|
|
2382
|
+
}
|
|
2383
|
+
}
|
|
2384
|
+
isBuilderOrder(builderCode) {
|
|
2385
|
+
return builderCode !== void 0 && builderCode !== bytes32Zero;
|
|
2386
|
+
}
|
|
2387
|
+
async _ensureMarketInfoCached(tokenID) {
|
|
2388
|
+
if (tokenID in this.feeInfos) return;
|
|
2389
|
+
if (!(tokenID in this.tokenConditionMap)) {
|
|
2390
|
+
const result = await this.get(`${this.host}${GET_MARKET_BY_TOKEN}${tokenID}`);
|
|
2391
|
+
if (!result?.condition_id) {
|
|
2392
|
+
throw new Error(`failed to resolve condition id for token ${tokenID}`);
|
|
2393
|
+
}
|
|
2394
|
+
this.tokenConditionMap[tokenID] = result.condition_id;
|
|
2395
|
+
}
|
|
2396
|
+
await this.getClobMarketInfo(this.tokenConditionMap[tokenID]);
|
|
2397
|
+
}
|
|
2398
|
+
async ensureBuilderFeeRateCached(builderCode) {
|
|
2399
|
+
if (!builderCode || builderCode === bytes32Zero) return;
|
|
2400
|
+
if (builderCode in this.builderFeeRates) return;
|
|
2401
|
+
const result = await this.get(`${this.host}${GET_BUILDER_FEES}${builderCode}`);
|
|
2402
|
+
this.builderFeeRates[builderCode] = {
|
|
2403
|
+
maker: result.builder_maker_fee_rate_bps / BUILDER_FEES_BPS,
|
|
2404
|
+
taker: result.builder_taker_fee_rate_bps / BUILDER_FEES_BPS
|
|
2405
|
+
};
|
|
2406
|
+
}
|
|
2407
|
+
async _resolveTickSize(tokenID, tickSize) {
|
|
2408
|
+
const minTickSize = await this.getTickSize(tokenID);
|
|
2409
|
+
if (tickSize) {
|
|
2410
|
+
if (isTickSizeSmaller(tickSize, minTickSize)) {
|
|
2411
|
+
throw new Error(
|
|
2412
|
+
`invalid tick size (${tickSize}), minimum for the market is ${minTickSize}`
|
|
2413
|
+
);
|
|
2414
|
+
}
|
|
2415
|
+
} else {
|
|
2416
|
+
tickSize = minTickSize;
|
|
2417
|
+
}
|
|
2418
|
+
return tickSize;
|
|
2419
|
+
}
|
|
2420
|
+
async _resolveFeeRateBps(tokenID, userFeeRateBps) {
|
|
2421
|
+
const marketFeeRateBps = await this.getFeeRateBps(tokenID);
|
|
2422
|
+
if (marketFeeRateBps > 0 && userFeeRateBps !== void 0 && userFeeRateBps !== marketFeeRateBps) {
|
|
2423
|
+
throw new Error(
|
|
2424
|
+
`invalid user provided fee rate: ${userFeeRateBps}, fee rate for the market must be ${marketFeeRateBps}`
|
|
2425
|
+
);
|
|
2426
|
+
}
|
|
2427
|
+
return marketFeeRateBps;
|
|
2428
|
+
}
|
|
2429
|
+
async resolveVersion(forceUpdate = false) {
|
|
2430
|
+
if (!forceUpdate && this.cachedVersion !== void 0) {
|
|
2431
|
+
return this.cachedVersion;
|
|
2432
|
+
}
|
|
2433
|
+
const apiVersion = await this.getVersion();
|
|
2434
|
+
this.cachedVersion = apiVersion;
|
|
2435
|
+
return apiVersion;
|
|
2436
|
+
}
|
|
2437
|
+
async _retryOnVersionUpdate(retryFunc) {
|
|
2438
|
+
const version = await this.resolveVersion();
|
|
2439
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
2440
|
+
await retryFunc();
|
|
2441
|
+
if (version === await this.resolveVersion()) break;
|
|
2442
|
+
}
|
|
2443
|
+
}
|
|
2444
|
+
_isOrderVersionMismatch(resp) {
|
|
2445
|
+
const error = resp?.error;
|
|
2446
|
+
if (!error) return false;
|
|
2447
|
+
const message = typeof error === "string" ? error : JSON.stringify(error);
|
|
2448
|
+
return message.includes(ORDER_VERSION_MISMATCH_ERROR);
|
|
2449
|
+
}
|
|
2450
|
+
throwIfError(result) {
|
|
2451
|
+
if (this.throwOnError && result && typeof result === "object" && "error" in result) {
|
|
2452
|
+
const msg = typeof result.error === "string" ? result.error : JSON.stringify(result.error);
|
|
2453
|
+
throw new ApiError(msg, result.status, result);
|
|
2454
|
+
}
|
|
2455
|
+
return result;
|
|
2456
|
+
}
|
|
2457
|
+
// http methods
|
|
2458
|
+
async get(endpoint, options, skipThrow = false) {
|
|
2459
|
+
const result = await get(endpoint, options);
|
|
2460
|
+
return skipThrow ? result : this.throwIfError(result);
|
|
2461
|
+
}
|
|
2462
|
+
async post(endpoint, options, skipThrow = false) {
|
|
2463
|
+
const result = await post(endpoint, options, this.retryOnError);
|
|
2464
|
+
return skipThrow ? result : this.throwIfError(result);
|
|
2465
|
+
}
|
|
2466
|
+
async del(endpoint, options, skipThrow = false) {
|
|
2467
|
+
const result = await del(endpoint, options);
|
|
2468
|
+
return skipThrow ? result : this.throwIfError(result);
|
|
2469
|
+
}
|
|
2470
|
+
};
|
|
2471
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
2472
|
+
0 && (module.exports = {
|
|
2473
|
+
ApiError,
|
|
2474
|
+
AssetType,
|
|
2475
|
+
COLLATERAL_TOKEN_DECIMALS,
|
|
2476
|
+
CONDITIONAL_TOKEN_DECIMALS,
|
|
2477
|
+
Chain,
|
|
2478
|
+
ClobClient,
|
|
2479
|
+
L1_AUTH_UNAVAILABLE_ERROR,
|
|
2480
|
+
L2_AUTH_NOT_AVAILABLE,
|
|
2481
|
+
OrderBuilder,
|
|
2482
|
+
OrderType,
|
|
2483
|
+
PriceHistoryInterval,
|
|
2484
|
+
Side,
|
|
2485
|
+
SignatureTypeV1,
|
|
2486
|
+
SignatureTypeV2,
|
|
2487
|
+
adjustBuyAmountForFees,
|
|
2488
|
+
createL1Headers,
|
|
2489
|
+
createL2Headers,
|
|
2490
|
+
getContractConfig,
|
|
2491
|
+
isV2Order,
|
|
2492
|
+
orderToJsonV1,
|
|
2493
|
+
orderToJsonV2
|
|
2494
|
+
});
|
|
2495
|
+
//# sourceMappingURL=index.cjs.map
|