@kuestcom/clob-client 5.8.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/LICENSE +22 -0
- package/README.md +101 -0
- package/dist/client.d.ts +164 -0
- package/dist/client.js +967 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.js +28 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.js +7 -0
- package/dist/constants.js.map +1 -0
- package/dist/endpoints.d.ts +67 -0
- package/dist/endpoints.js +82 -0
- package/dist/endpoints.js.map +1 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -0
- package/dist/headers/index.d.ts +6 -0
- package/dist/headers/index.js +42 -0
- package/dist/headers/index.js.map +1 -0
- package/dist/http-helpers/index.d.ts +21 -0
- package/dist/http-helpers/index.js +151 -0
- package/dist/http-helpers/index.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/order-builder/builder.d.ts +29 -0
- package/dist/order-builder/builder.js +52 -0
- package/dist/order-builder/builder.js.map +1 -0
- package/dist/order-builder/helpers.d.ts +50 -0
- package/dist/order-builder/helpers.js +276 -0
- package/dist/order-builder/helpers.js.map +1 -0
- package/dist/order-builder/index.d.ts +1 -0
- package/dist/order-builder/index.js +2 -0
- package/dist/order-builder/index.js.map +1 -0
- package/dist/order-utils/exchange.order.builder.d.ts +31 -0
- package/dist/order-utils/exchange.order.builder.js +120 -0
- package/dist/order-utils/exchange.order.builder.js.map +1 -0
- package/dist/order-utils/exchange.order.const.d.ts +13 -0
- package/dist/order-utils/exchange.order.const.js +28 -0
- package/dist/order-utils/exchange.order.const.js.map +1 -0
- package/dist/order-utils/index.d.ts +6 -0
- package/dist/order-utils/index.js +7 -0
- package/dist/order-utils/index.js.map +1 -0
- package/dist/order-utils/model/eip712.model.d.ts +25 -0
- package/dist/order-utils/model/eip712.model.js +2 -0
- package/dist/order-utils/model/eip712.model.js.map +1 -0
- package/dist/order-utils/model/order-side.model.d.ts +4 -0
- package/dist/order-utils/model/order-side.model.js +6 -0
- package/dist/order-utils/model/order-side.model.js.map +1 -0
- package/dist/order-utils/model/order.model.d.ts +112 -0
- package/dist/order-utils/model/order.model.js +2 -0
- package/dist/order-utils/model/order.model.js.map +1 -0
- package/dist/order-utils/model/signature-types.model.d.ts +14 -0
- package/dist/order-utils/model/signature-types.model.js +16 -0
- package/dist/order-utils/model/signature-types.model.js.map +1 -0
- package/dist/order-utils/utils.d.ts +1 -0
- package/dist/order-utils/utils.js +4 -0
- package/dist/order-utils/utils.js.map +1 -0
- package/dist/rfq-client.d.ts +64 -0
- package/dist/rfq-client.js +403 -0
- package/dist/rfq-client.js.map +1 -0
- package/dist/rfq-deps.d.ts +44 -0
- package/dist/rfq-deps.js +2 -0
- package/dist/rfq-deps.js.map +1 -0
- package/dist/signer.d.ts +22 -0
- package/dist/signer.js +50 -0
- package/dist/signer.js.map +1 -0
- package/dist/signing/constants.d.ts +14 -0
- package/dist/signing/constants.js +16 -0
- package/dist/signing/constants.js.map +1 -0
- package/dist/signing/eip712.d.ts +9 -0
- package/dist/signing/eip712.js +40 -0
- package/dist/signing/eip712.js.map +1 -0
- package/dist/signing/hmac.d.ts +9 -0
- package/dist/signing/hmac.js +58 -0
- package/dist/signing/hmac.js.map +1 -0
- package/dist/signing/index.d.ts +2 -0
- package/dist/signing/index.js +3 -0
- package/dist/signing/index.js.map +1 -0
- package/dist/types.d.ts +667 -0
- package/dist/types.js +37 -0
- package/dist/types.js.map +1 -0
- package/dist/utilities.d.ts +16 -0
- package/dist/utilities.js +93 -0
- package/dist/utilities.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import { parseUnits } from "viem";
|
|
2
|
+
import { COLLATERAL_TOKEN_DECIMALS } from "./config.js";
|
|
3
|
+
import { CANCEL_RFQ_QUOTE, CANCEL_RFQ_REQUEST, CREATE_RFQ_QUOTE, CREATE_RFQ_REQUEST, GET_RFQ_BEST_QUOTE, GET_RFQ_QUOTER_QUOTES, GET_RFQ_REQUESTER_QUOTES, GET_RFQ_REQUESTS, RFQ_CONFIG, RFQ_QUOTE_APPROVE, RFQ_REQUESTS_ACCEPT, } from "./endpoints.js";
|
|
4
|
+
import { L1_AUTH_UNAVAILABLE_ERROR, L2_AUTH_NOT_AVAILABLE } from "./errors.js";
|
|
5
|
+
import { createL2Headers } from "./headers/index.js";
|
|
6
|
+
import { DELETE, GET, POST } from "./http-helpers/index.js";
|
|
7
|
+
import { ROUNDING_CONFIG } from "./order-builder/helpers.js";
|
|
8
|
+
import { RfqMatchType, Side } from "./types.js";
|
|
9
|
+
import { roundDown, roundNormal } from "./utilities.js";
|
|
10
|
+
// RFQ list params need to be repeated e.g. quoteIds=..."eIds=...
|
|
11
|
+
const buildRepeatedQuery = (params) => {
|
|
12
|
+
const sp = new URLSearchParams();
|
|
13
|
+
if (!params)
|
|
14
|
+
return "";
|
|
15
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
16
|
+
if (value === undefined || value === null) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (Array.isArray(value)) {
|
|
20
|
+
for (const v of value)
|
|
21
|
+
sp.append(key, String(v));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
sp.append(key, String(value));
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
return sp.toString();
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* RfqClient provides RFQ (Request for Quote) functionality on top of a CLOB client.
|
|
31
|
+
*/
|
|
32
|
+
export class RfqClient {
|
|
33
|
+
deps;
|
|
34
|
+
constructor(deps) {
|
|
35
|
+
this.deps = deps;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Creates and posts an RFQ request from user order parameters.
|
|
39
|
+
* Converts the order into the proper RFQ request format with asset amounts and submits it.
|
|
40
|
+
*/
|
|
41
|
+
async createRfqRequest(userOrder, options) {
|
|
42
|
+
this.ensureL2Auth();
|
|
43
|
+
const { tokenID, price, side, size } = userOrder;
|
|
44
|
+
const tickSize = await this.deps.resolveTickSize(tokenID, options?.tickSize);
|
|
45
|
+
const roundConfig = ROUNDING_CONFIG[tickSize];
|
|
46
|
+
const roundedPrice = roundNormal(price, roundConfig.price).toFixed(roundConfig.price);
|
|
47
|
+
const roundedSize = roundDown(size, roundConfig.size).toFixed(roundConfig.size);
|
|
48
|
+
// Calculate amounts based on side
|
|
49
|
+
const sizeNum = Number.parseFloat(roundedSize);
|
|
50
|
+
const priceNum = Number.parseFloat(roundedPrice);
|
|
51
|
+
let amountIn;
|
|
52
|
+
let amountOut;
|
|
53
|
+
let assetIn;
|
|
54
|
+
let assetOut;
|
|
55
|
+
if (side === Side.BUY) {
|
|
56
|
+
// Buying: pay USDC (asset 0), receive tokens (tokenID)
|
|
57
|
+
amountIn = parseUnits(roundedSize, COLLATERAL_TOKEN_DECIMALS).toString();
|
|
58
|
+
amountOut = parseUnits((sizeNum * priceNum).toFixed(roundConfig.amount), COLLATERAL_TOKEN_DECIMALS).toString();
|
|
59
|
+
assetIn = tokenID;
|
|
60
|
+
assetOut = "0"; // USDC
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Selling: pay tokens (tokenID), receive USDC (asset 0)
|
|
64
|
+
amountIn = parseUnits((sizeNum * priceNum).toFixed(roundConfig.amount), COLLATERAL_TOKEN_DECIMALS).toString();
|
|
65
|
+
amountOut = parseUnits(roundedSize, COLLATERAL_TOKEN_DECIMALS).toString();
|
|
66
|
+
assetIn = "0"; // USDC
|
|
67
|
+
assetOut = tokenID;
|
|
68
|
+
}
|
|
69
|
+
const payload = {
|
|
70
|
+
assetIn,
|
|
71
|
+
assetOut,
|
|
72
|
+
amountIn,
|
|
73
|
+
amountOut,
|
|
74
|
+
userType: this.deps.userType,
|
|
75
|
+
};
|
|
76
|
+
const endpoint = CREATE_RFQ_REQUEST;
|
|
77
|
+
const l2HeaderArgs = {
|
|
78
|
+
method: POST,
|
|
79
|
+
requestPath: endpoint,
|
|
80
|
+
body: JSON.stringify(payload),
|
|
81
|
+
};
|
|
82
|
+
const headers = await createL2Headers(this.deps.signer, this.deps.creds, l2HeaderArgs, this.deps.useServerTime ? await this.deps.getServerTime() : undefined);
|
|
83
|
+
return this.deps.post(`${this.deps.host}${endpoint}`, { headers, data: payload });
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Cancels an existing RFQ request
|
|
87
|
+
*/
|
|
88
|
+
async cancelRfqRequest(request) {
|
|
89
|
+
this.ensureL2Auth();
|
|
90
|
+
const endpoint = CANCEL_RFQ_REQUEST;
|
|
91
|
+
const l2HeaderArgs = {
|
|
92
|
+
method: DELETE,
|
|
93
|
+
requestPath: endpoint,
|
|
94
|
+
body: JSON.stringify(request),
|
|
95
|
+
};
|
|
96
|
+
const headers = await createL2Headers(this.deps.signer, this.deps.creds, l2HeaderArgs, this.deps.useServerTime ? await this.deps.getServerTime() : undefined);
|
|
97
|
+
return this.deps.del(`${this.deps.host}${endpoint}`, { headers, data: request });
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Gets RFQ requests with optional filtering parameters
|
|
101
|
+
*/
|
|
102
|
+
async getRfqRequests(params) {
|
|
103
|
+
this.ensureL2Auth();
|
|
104
|
+
const endpoint = GET_RFQ_REQUESTS;
|
|
105
|
+
const l2HeaderArgs = {
|
|
106
|
+
method: GET,
|
|
107
|
+
requestPath: endpoint,
|
|
108
|
+
};
|
|
109
|
+
const headers = await createL2Headers(this.deps.signer, this.deps.creds, l2HeaderArgs, this.deps.useServerTime ? await this.deps.getServerTime() : undefined);
|
|
110
|
+
const query = buildRepeatedQuery(params);
|
|
111
|
+
const url = query
|
|
112
|
+
? `${this.deps.host}${endpoint}?${query}`
|
|
113
|
+
: `${this.deps.host}${endpoint}`;
|
|
114
|
+
return this.deps.get(url, { headers });
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Creates a quote in response to an RFQ request.
|
|
118
|
+
* Converts user-friendly parameters into the proper RFQ quote format with asset amounts and submits it.
|
|
119
|
+
*/
|
|
120
|
+
async createRfqQuote(userQuote, options) {
|
|
121
|
+
this.ensureL2Auth();
|
|
122
|
+
const { requestId, tokenID, price, side, size } = userQuote;
|
|
123
|
+
const tickSize = await this.deps.resolveTickSize(tokenID, options?.tickSize);
|
|
124
|
+
const roundConfig = ROUNDING_CONFIG[tickSize];
|
|
125
|
+
const roundedPrice = roundNormal(price, roundConfig.price).toFixed(roundConfig.price);
|
|
126
|
+
const roundedSize = roundDown(size, roundConfig.size).toFixed(roundConfig.size);
|
|
127
|
+
// Calculate amounts based on side
|
|
128
|
+
const sizeNum = Number.parseFloat(roundedSize);
|
|
129
|
+
const priceNum = Number.parseFloat(roundedPrice);
|
|
130
|
+
let amountIn;
|
|
131
|
+
let amountOut;
|
|
132
|
+
let assetIn;
|
|
133
|
+
let assetOut;
|
|
134
|
+
if (side === Side.SELL) {
|
|
135
|
+
// Quoter selling tokens: receive USDC (asset 0), give tokens (tokenID)
|
|
136
|
+
amountIn = parseUnits((sizeNum * priceNum).toFixed(roundConfig.amount), COLLATERAL_TOKEN_DECIMALS).toString();
|
|
137
|
+
amountOut = parseUnits(roundedSize, COLLATERAL_TOKEN_DECIMALS).toString();
|
|
138
|
+
assetIn = "0"; // USDC
|
|
139
|
+
assetOut = tokenID;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Quoter buying tokens: receive tokens (tokenID), give USDC (asset 0)
|
|
143
|
+
amountIn = parseUnits(roundedSize, COLLATERAL_TOKEN_DECIMALS).toString();
|
|
144
|
+
amountOut = parseUnits((sizeNum * priceNum).toFixed(roundConfig.amount), COLLATERAL_TOKEN_DECIMALS).toString();
|
|
145
|
+
assetIn = tokenID;
|
|
146
|
+
assetOut = "0"; // USDC
|
|
147
|
+
}
|
|
148
|
+
const payload = {
|
|
149
|
+
requestId,
|
|
150
|
+
assetIn,
|
|
151
|
+
assetOut,
|
|
152
|
+
amountIn,
|
|
153
|
+
amountOut,
|
|
154
|
+
};
|
|
155
|
+
const endpoint = CREATE_RFQ_QUOTE;
|
|
156
|
+
// Auto-fill userType from client's signatureType
|
|
157
|
+
const quoteWithUserType = {
|
|
158
|
+
...payload,
|
|
159
|
+
userType: this.deps.userType,
|
|
160
|
+
};
|
|
161
|
+
const l2HeaderArgs = {
|
|
162
|
+
method: POST,
|
|
163
|
+
requestPath: endpoint,
|
|
164
|
+
body: JSON.stringify(quoteWithUserType),
|
|
165
|
+
};
|
|
166
|
+
const headers = await createL2Headers(this.deps.signer, this.deps.creds, l2HeaderArgs, this.deps.useServerTime ? await this.deps.getServerTime() : undefined);
|
|
167
|
+
return this.deps.post(`${this.deps.host}${endpoint}`, { headers, data: quoteWithUserType });
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Gets quotes on requests created by the authenticated user (requester view).
|
|
171
|
+
* Returns quotes that others have made on your requests.
|
|
172
|
+
*/
|
|
173
|
+
async getRfqRequesterQuotes(params) {
|
|
174
|
+
this.ensureL2Auth();
|
|
175
|
+
const endpoint = GET_RFQ_REQUESTER_QUOTES;
|
|
176
|
+
const l2HeaderArgs = {
|
|
177
|
+
method: GET,
|
|
178
|
+
requestPath: endpoint,
|
|
179
|
+
};
|
|
180
|
+
const headers = await createL2Headers(this.deps.signer, this.deps.creds, l2HeaderArgs, this.deps.useServerTime ? await this.deps.getServerTime() : undefined);
|
|
181
|
+
const query = buildRepeatedQuery(params);
|
|
182
|
+
const url = query
|
|
183
|
+
? `${this.deps.host}${endpoint}?${query}`
|
|
184
|
+
: `${this.deps.host}${endpoint}`;
|
|
185
|
+
return this.deps.get(url, { headers });
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Gets quotes created by the authenticated user (quoter view).
|
|
189
|
+
* Returns quotes that you have made on others' requests.
|
|
190
|
+
*/
|
|
191
|
+
async getRfqQuoterQuotes(params) {
|
|
192
|
+
this.ensureL2Auth();
|
|
193
|
+
const endpoint = GET_RFQ_QUOTER_QUOTES;
|
|
194
|
+
const l2HeaderArgs = {
|
|
195
|
+
method: GET,
|
|
196
|
+
requestPath: endpoint,
|
|
197
|
+
};
|
|
198
|
+
const headers = await createL2Headers(this.deps.signer, this.deps.creds, l2HeaderArgs, this.deps.useServerTime ? await this.deps.getServerTime() : undefined);
|
|
199
|
+
const query = buildRepeatedQuery(params);
|
|
200
|
+
const url = query
|
|
201
|
+
? `${this.deps.host}${endpoint}?${query}`
|
|
202
|
+
: `${this.deps.host}${endpoint}`;
|
|
203
|
+
return this.deps.get(url, { headers });
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Gets the best quote for a given request ID
|
|
207
|
+
*/
|
|
208
|
+
async getRfqBestQuote(params) {
|
|
209
|
+
this.ensureL2Auth();
|
|
210
|
+
const endpoint = GET_RFQ_BEST_QUOTE;
|
|
211
|
+
const l2HeaderArgs = {
|
|
212
|
+
method: GET,
|
|
213
|
+
requestPath: endpoint,
|
|
214
|
+
};
|
|
215
|
+
const headers = await createL2Headers(this.deps.signer, this.deps.creds, l2HeaderArgs, this.deps.useServerTime ? await this.deps.getServerTime() : undefined);
|
|
216
|
+
return this.deps.get(`${this.deps.host}${endpoint}`, { headers, params });
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Cancels an existing quote
|
|
220
|
+
*/
|
|
221
|
+
async cancelRfqQuote(quote) {
|
|
222
|
+
this.ensureL2Auth();
|
|
223
|
+
const endpoint = CANCEL_RFQ_QUOTE;
|
|
224
|
+
const l2HeaderArgs = {
|
|
225
|
+
method: DELETE,
|
|
226
|
+
requestPath: endpoint,
|
|
227
|
+
body: JSON.stringify(quote),
|
|
228
|
+
};
|
|
229
|
+
const headers = await createL2Headers(this.deps.signer, this.deps.creds, l2HeaderArgs, this.deps.useServerTime ? await this.deps.getServerTime() : undefined);
|
|
230
|
+
return this.deps.del(`${this.deps.host}${endpoint}`, { headers, data: quote });
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Gets the RFQ configuration from the server
|
|
234
|
+
*/
|
|
235
|
+
async rfqConfig() {
|
|
236
|
+
this.ensureL2Auth();
|
|
237
|
+
const endpoint = RFQ_CONFIG;
|
|
238
|
+
const l2HeaderArgs = {
|
|
239
|
+
method: GET,
|
|
240
|
+
requestPath: endpoint,
|
|
241
|
+
};
|
|
242
|
+
const headers = await createL2Headers(this.deps.signer, this.deps.creds, l2HeaderArgs, this.deps.useServerTime ? await this.deps.getServerTime() : undefined);
|
|
243
|
+
return this.deps.get(`${this.deps.host}${endpoint}`, { headers });
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Accepts a quote and creates an order (taker side)
|
|
247
|
+
* This fetches the request details, creates an order, and submits the acceptance
|
|
248
|
+
*/
|
|
249
|
+
async acceptRfqQuote(payload) {
|
|
250
|
+
this.ensureL2Auth();
|
|
251
|
+
const rfqQuotes = await this.getRfqRequesterQuotes({
|
|
252
|
+
quoteIds: [payload.quoteId],
|
|
253
|
+
});
|
|
254
|
+
// Check for HTTP errors first (network failures, auth errors, server errors)
|
|
255
|
+
if ("error" in rfqQuotes) {
|
|
256
|
+
const errorMsg = typeof rfqQuotes.error === "string"
|
|
257
|
+
? rfqQuotes.error
|
|
258
|
+
: JSON.stringify(rfqQuotes.error);
|
|
259
|
+
throw new Error(`Error fetching RFQ quote: ${errorMsg}`);
|
|
260
|
+
}
|
|
261
|
+
if (!rfqQuotes?.data || rfqQuotes.data.length === 0) {
|
|
262
|
+
throw new Error("RFQ quote not found");
|
|
263
|
+
}
|
|
264
|
+
const rfqQuote = rfqQuotes.data[0];
|
|
265
|
+
// Create an order, matching the quote
|
|
266
|
+
const orderPayload = this.getRequestOrderCreationPayload(rfqQuote);
|
|
267
|
+
const orderSide = orderPayload.side;
|
|
268
|
+
const size = orderPayload.size;
|
|
269
|
+
const token = orderPayload.token;
|
|
270
|
+
const order = await this.deps.createOrder({
|
|
271
|
+
tokenID: token,
|
|
272
|
+
price: orderPayload.price,
|
|
273
|
+
size: Number.parseFloat(size),
|
|
274
|
+
side: orderSide,
|
|
275
|
+
expiration: payload.expiration,
|
|
276
|
+
});
|
|
277
|
+
if (!order) {
|
|
278
|
+
throw new Error("Error creating order");
|
|
279
|
+
}
|
|
280
|
+
const acceptPayload = {
|
|
281
|
+
requestId: payload.requestId,
|
|
282
|
+
quoteId: payload.quoteId,
|
|
283
|
+
owner: this.deps.creds.key,
|
|
284
|
+
...order,
|
|
285
|
+
expiration: Number.parseInt(order.expiration, 10),
|
|
286
|
+
side: orderSide,
|
|
287
|
+
salt: Number.parseInt(order.salt.toString(), 10),
|
|
288
|
+
};
|
|
289
|
+
const endpoint = RFQ_REQUESTS_ACCEPT;
|
|
290
|
+
const l2HeaderArgs = {
|
|
291
|
+
method: POST,
|
|
292
|
+
requestPath: endpoint,
|
|
293
|
+
body: JSON.stringify(acceptPayload),
|
|
294
|
+
};
|
|
295
|
+
const headers = await createL2Headers(this.deps.signer, this.deps.creds, l2HeaderArgs, this.deps.useServerTime ? await this.deps.getServerTime() : undefined);
|
|
296
|
+
return this.deps.post(`${this.deps.host}${endpoint}`, { headers, data: acceptPayload });
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Approves a quote and creates an order (maker side)
|
|
300
|
+
* This fetches the quote details, creates an order, and submits the approval
|
|
301
|
+
*/
|
|
302
|
+
async approveRfqOrder(payload) {
|
|
303
|
+
this.ensureL2Auth();
|
|
304
|
+
const rfqQuotes = await this.getRfqQuoterQuotes({
|
|
305
|
+
quoteIds: [payload.quoteId],
|
|
306
|
+
});
|
|
307
|
+
// Check for HTTP errors first (network failures, auth errors, server errors)
|
|
308
|
+
if ("error" in rfqQuotes) {
|
|
309
|
+
const errorMsg = typeof rfqQuotes.error === "string"
|
|
310
|
+
? rfqQuotes.error
|
|
311
|
+
: JSON.stringify(rfqQuotes.error);
|
|
312
|
+
throw new Error(`Error fetching RFQ quote: ${errorMsg}`);
|
|
313
|
+
}
|
|
314
|
+
if (!rfqQuotes?.data || rfqQuotes.data.length === 0) {
|
|
315
|
+
throw new Error("RFQ quote not found");
|
|
316
|
+
}
|
|
317
|
+
const rfqQuote = rfqQuotes.data[0];
|
|
318
|
+
// Create an order based on the quote details
|
|
319
|
+
const side = rfqQuote.side === "BUY" ? Side.BUY : Side.SELL;
|
|
320
|
+
const size = rfqQuote.side === "BUY" ? rfqQuote.sizeIn : rfqQuote.sizeOut;
|
|
321
|
+
const order = await this.deps.createOrder({
|
|
322
|
+
tokenID: rfqQuote.token,
|
|
323
|
+
price: rfqQuote.price,
|
|
324
|
+
size: Number.parseFloat(size),
|
|
325
|
+
side: side,
|
|
326
|
+
expiration: payload.expiration,
|
|
327
|
+
});
|
|
328
|
+
if (!order) {
|
|
329
|
+
throw new Error("Error creating order");
|
|
330
|
+
}
|
|
331
|
+
const approvePayload = {
|
|
332
|
+
requestId: payload.requestId,
|
|
333
|
+
quoteId: payload.quoteId,
|
|
334
|
+
owner: this.deps.creds.key,
|
|
335
|
+
...order,
|
|
336
|
+
expiration: Number.parseInt(order.expiration, 10),
|
|
337
|
+
side: side,
|
|
338
|
+
salt: Number.parseInt(order.salt.toString(), 10),
|
|
339
|
+
};
|
|
340
|
+
const endpoint = RFQ_QUOTE_APPROVE;
|
|
341
|
+
const l2HeaderArgs = {
|
|
342
|
+
method: POST,
|
|
343
|
+
requestPath: endpoint,
|
|
344
|
+
body: JSON.stringify(approvePayload),
|
|
345
|
+
};
|
|
346
|
+
const headers = await createL2Headers(this.deps.signer, this.deps.creds, l2HeaderArgs, this.deps.useServerTime ? await this.deps.getServerTime() : undefined);
|
|
347
|
+
return this.deps.post(`${this.deps.host}${endpoint}`, { headers, data: approvePayload });
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Ensures L2 authentication is available for RFQ endpoints.
|
|
351
|
+
*/
|
|
352
|
+
ensureL2Auth() {
|
|
353
|
+
if (this.deps.signer === undefined) {
|
|
354
|
+
throw L1_AUTH_UNAVAILABLE_ERROR;
|
|
355
|
+
}
|
|
356
|
+
if (this.deps.creds === undefined) {
|
|
357
|
+
throw L2_AUTH_NOT_AVAILABLE;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
getRequestOrderCreationPayload(quote) {
|
|
361
|
+
const quoteSide = quote.side;
|
|
362
|
+
const matchType = quote.matchType;
|
|
363
|
+
let side;
|
|
364
|
+
let token;
|
|
365
|
+
let size;
|
|
366
|
+
let price;
|
|
367
|
+
switch (matchType) {
|
|
368
|
+
case RfqMatchType.COMPLEMENTARY:
|
|
369
|
+
// For BUY <> SELL and SELL <> BUY
|
|
370
|
+
// the order side is opposite the quote side
|
|
371
|
+
side = quoteSide === "BUY" ? Side.SELL : Side.BUY;
|
|
372
|
+
token = quote.token;
|
|
373
|
+
size = side === Side.BUY ? quote.sizeOut : quote.sizeIn;
|
|
374
|
+
price = quote.price;
|
|
375
|
+
return {
|
|
376
|
+
token,
|
|
377
|
+
side,
|
|
378
|
+
size,
|
|
379
|
+
price,
|
|
380
|
+
};
|
|
381
|
+
case RfqMatchType.MINT:
|
|
382
|
+
case RfqMatchType.MERGE:
|
|
383
|
+
// BUY<> BUY, SELL <> SELL
|
|
384
|
+
// the order side is the same as the quote side
|
|
385
|
+
side = quoteSide === "BUY" ? Side.BUY : Side.SELL;
|
|
386
|
+
token = quote.complement;
|
|
387
|
+
size = side === Side.BUY ? quote.sizeIn : quote.sizeOut;
|
|
388
|
+
// For a MINT or a MERGE, the requester price is the inverse of the quote price
|
|
389
|
+
// 95c Quote to BUY NO, implies that the Requester is buying YES at 5c
|
|
390
|
+
// 45c Quote to SELL NO, implies the Requester is selling YES at 55c
|
|
391
|
+
price = 1 - quote.price;
|
|
392
|
+
return {
|
|
393
|
+
token,
|
|
394
|
+
side,
|
|
395
|
+
size,
|
|
396
|
+
price,
|
|
397
|
+
};
|
|
398
|
+
default:
|
|
399
|
+
throw new Error("invalid match type");
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=rfq-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rfq-client.js","sourceRoot":"","sources":["../src/rfq-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EACH,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EACxB,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,mBAAmB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAwB7D,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAExD,qEAAqE;AACrE,MAAM,kBAAkB,GAAG,CAAC,MAA4B,EAAU,EAAE;IAChE,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC5C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACxC,OAAO;QACX,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACJ,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;AACzB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,SAAS;IACW;IAA7B,YAA6B,IAAa;QAAb,SAAI,GAAJ,IAAI,CAAS;IAAG,CAAC;IAE9C;;;OAGG;IACI,KAAK,CAAC,gBAAgB,CACzB,SAAuB,EACvB,OAAqC;QAErC,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;QAEjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE7E,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAE9C,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtF,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAEhF,kCAAkC;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAEjD,IAAI,QAAgB,CAAC;QACrB,IAAI,SAAiB,CAAC;QACtB,IAAI,OAAe,CAAC;QACpB,IAAI,QAAgB,CAAC;QAErB,IAAI,IAAI,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;YACpB,uDAAuD;YACvD,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC,QAAQ,EAAE,CAAC;YACzE,SAAS,GAAG,UAAU,CAClB,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAChD,yBAAyB,CAC5B,CAAC,QAAQ,EAAE,CAAC;YACb,OAAO,GAAG,OAAO,CAAC;YAClB,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO;QAC3B,CAAC;aAAM,CAAC;YACJ,wDAAwD;YACxD,QAAQ,GAAG,UAAU,CACjB,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAChD,yBAAyB,CAC5B,CAAC,QAAQ,EAAE,CAAC;YACb,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC1E,OAAO,GAAG,GAAG,CAAC,CAAC,OAAO;YACtB,QAAQ,GAAG,OAAO,CAAC;QACvB,CAAC;QAED,MAAM,OAAO,GAA2B;YACpC,OAAO;YACP,QAAQ;YACR,QAAQ;YACR,SAAS;YACT,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ;SAC/B,CAAC;QAEF,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QAEpC,MAAM,YAAY,GAAG;YACjB,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,QAAQ;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAChC,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,eAAe,CACjC,IAAI,CAAC,IAAI,CAAC,MAAoB,EAC9B,IAAI,CAAC,IAAI,CAAC,KAAoB,EAC9B,YAAY,EACZ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC;QAEF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,gBAAgB,CAAC,OAA+B;QACzD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QAEpC,MAAM,YAAY,GAAG;YACjB,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,QAAQ;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAChC,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,eAAe,CACjC,IAAI,CAAC,IAAI,CAAC,MAAoB,EAC9B,IAAI,CAAC,IAAI,CAAC,KAAoB,EAC9B,YAAY,EACZ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC;QAEF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACrF,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,cAAc,CAAC,MAA6B;QACrD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,gBAAgB,CAAC;QAElC,MAAM,YAAY,GAAG;YACjB,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,QAAQ;SACxB,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,eAAe,CACjC,IAAI,CAAC,IAAI,CAAC,MAAoB,EAC9B,IAAI,CAAC,IAAI,CAAC,KAAoB,EAC9B,YAAY,EACZ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC;QAEF,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,KAAK;YACb,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,IAAI,KAAK,EAAE;YACzC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;QAErC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAiC,CAAC;IAC3E,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,cAAc,CACvB,SAAuB,EACvB,OAAqC;QAErC,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;QAE5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE7E,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAE9C,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtF,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAEhF,kCAAkC;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAEjD,IAAI,QAAgB,CAAC;QACrB,IAAI,SAAiB,CAAC;QACtB,IAAI,OAAe,CAAC;QACpB,IAAI,QAAgB,CAAC;QAErB,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,uEAAuE;YACvE,QAAQ,GAAG,UAAU,CACjB,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAChD,yBAAyB,CAC5B,CAAC,QAAQ,EAAE,CAAC;YACb,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC1E,OAAO,GAAG,GAAG,CAAC,CAAC,OAAO;YACtB,QAAQ,GAAG,OAAO,CAAC;QACvB,CAAC;aAAM,CAAC;YACJ,sEAAsE;YACtE,QAAQ,GAAG,UAAU,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC,QAAQ,EAAE,CAAC;YACzE,SAAS,GAAG,UAAU,CAClB,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAChD,yBAAyB,CAC5B,CAAC,QAAQ,EAAE,CAAC;YACb,OAAO,GAAG,OAAO,CAAC;YAClB,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO;QAC3B,CAAC;QAED,MAAM,OAAO,GAAyB;YAClC,SAAS;YACT,OAAO;YACP,QAAQ;YACR,QAAQ;YACR,SAAS;SACZ,CAAC;QAEF,MAAM,QAAQ,GAAG,gBAAgB,CAAC;QAElC,iDAAiD;QACjD,MAAM,iBAAiB,GAAG;YACtB,GAAG,OAAO;YACV,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ;SAC/B,CAAC;QAEF,MAAM,YAAY,GAAG;YACjB,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,QAAQ;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;SAC1C,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,eAAe,CACjC,IAAI,CAAC,IAAI,CAAC,MAAoB,EAC9B,IAAI,CAAC,IAAI,CAAC,KAAoB,EAC9B,YAAY,EACZ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC;QAEF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAChG,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,qBAAqB,CAAC,MAA2B;QAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,wBAAwB,CAAC;QAE1C,MAAM,YAAY,GAAG;YACjB,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,QAAQ;SACxB,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,eAAe,CACjC,IAAI,CAAC,IAAI,CAAC,MAAoB,EAC9B,IAAI,CAAC,IAAI,CAAC,KAAoB,EAC9B,YAAY,EACZ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC;QAEF,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,KAAK;YACb,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,IAAI,KAAK,EAAE;YACzC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;QAErC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAA+B,CAAC;IACzE,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,kBAAkB,CAAC,MAA2B;QACvD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,qBAAqB,CAAC;QAEvC,MAAM,YAAY,GAAG;YACjB,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,QAAQ;SACxB,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,eAAe,CACjC,IAAI,CAAC,IAAI,CAAC,MAAoB,EAC9B,IAAI,CAAC,IAAI,CAAC,KAAoB,EAC9B,YAAY,EACZ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC;QAEF,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,KAAK;YACb,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,IAAI,KAAK,EAAE;YACzC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;QAErC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAA+B,CAAC;IACzE,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,eAAe,CAAC,MAA8B;QACvD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QACpC,MAAM,YAAY,GAAG;YACjB,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,QAAQ;SACxB,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,eAAe,CACjC,IAAI,CAAC,IAAI,CAAC,MAAoB,EAC9B,IAAI,CAAC,IAAI,CAAC,KAAoB,EAC9B,YAAY,EACZ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC;QAEF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,cAAc,CAAC,KAA2B;QACnD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,gBAAgB,CAAC;QAElC,MAAM,YAAY,GAAG;YACjB,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,QAAQ;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC9B,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,eAAe,CACjC,IAAI,CAAC,IAAI,CAAC,MAAoB,EAC9B,IAAI,CAAC,IAAI,CAAC,KAAoB,EAC9B,YAAY,EACZ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC;QAEF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnF,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,SAAS;QAClB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,UAAU,CAAC;QAE5B,MAAM,YAAY,GAAG;YACjB,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,QAAQ;SACxB,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,eAAe,CACjC,IAAI,CAAC,IAAI,CAAC,MAAoB,EAC9B,IAAI,CAAC,IAAI,CAAC,KAAoB,EAC9B,YAAY,EACZ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC;QAEF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,cAAc,CAAC,OAA0B;QAClD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,SAAS,GAAuC,MAAM,IAAI,CAAC,qBAAqB,CAAC;YACnF,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;QACH,6EAA6E;QAC7E,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;YACvB,MAAM,QAAQ,GACV,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;gBAC/B,CAAC,CAAC,SAAS,CAAC,KAAK;gBACjB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnC,sCAAsC;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;QACnE,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC;QACpC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;QAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;QAEjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;YACtC,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,YAAY,CAAC,KAAK;YACzB,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;YAC7B,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,OAAO,CAAC,UAAU;SACjC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,aAAa,GAAG;YAClB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAG,IAAI,CAAC,IAAI,CAAC,KAAqB,CAAC,GAAG;YAC3C,GAAG,KAAK;YACR,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;YACjD,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;SACnD,CAAC;QAEF,MAAM,QAAQ,GAAG,mBAAmB,CAAC;QAErC,MAAM,YAAY,GAAG;YACjB,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,QAAQ;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;SACtC,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,eAAe,CACjC,IAAI,CAAC,IAAI,CAAC,MAAoB,EAC9B,IAAI,CAAC,IAAI,CAAC,KAAoB,EAC9B,YAAY,EACZ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC;QAEF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,eAAe,CAAC,OAA2B;QACpD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,SAAS,GAAuC,MAAM,IAAI,CAAC,kBAAkB,CAAC;YAChF,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;QACH,6EAA6E;QAC7E,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;YACvB,MAAM,QAAQ,GACV,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;gBAC/B,CAAC,CAAC,SAAS,CAAC,KAAK;gBACjB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnC,6CAA6C;QAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAE1E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;YACtC,OAAO,EAAE,QAAQ,CAAC,KAAK;YACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;YAC7B,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,OAAO,CAAC,UAAU;SACjC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,cAAc,GAAG;YACnB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAG,IAAI,CAAC,IAAI,CAAC,KAAqB,CAAC,GAAG;YAC3C,GAAG,KAAK;YACR,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;YACjD,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;SACnD,CAAC;QAEF,MAAM,QAAQ,GAAG,iBAAiB,CAAC;QAEnC,MAAM,YAAY,GAAG;YACjB,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,QAAQ;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;SACvC,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,eAAe,CACjC,IAAI,CAAC,IAAI,CAAC,MAAoB,EAC9B,IAAI,CAAC,IAAI,CAAC,KAAoB,EAC9B,YAAY,EACZ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC;QAEF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED;;OAEG;IACO,YAAY;QAClB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,yBAAyB,CAAC;QACpC,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,qBAAqB,CAAC;QAChC,CAAC;IACL,CAAC;IAEO,8BAA8B,CAAC,KAAe;QAClD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;QAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAClC,IAAI,IAAU,CAAC;QACf,IAAI,KAAa,CAAC;QAClB,IAAI,IAAY,CAAC;QACjB,IAAI,KAAa,CAAC;QAElB,QAAQ,SAAS,EAAE,CAAC;YAChB,KAAK,YAAY,CAAC,aAAa;gBAC3B,kCAAkC;gBAClC,4CAA4C;gBAC5C,IAAI,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAClD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBACpB,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBACxD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBACpB,OAAO;oBACH,KAAK;oBACL,IAAI;oBACJ,IAAI;oBACJ,KAAK;iBACR,CAAC;YACN,KAAK,YAAY,CAAC,IAAI,CAAC;YACvB,KAAK,YAAY,CAAC,KAAK;gBACnB,0BAA0B;gBAC1B,+CAA+C;gBAE/C,IAAI,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAClD,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;gBACzB,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;gBACxD,+EAA+E;gBAC/E,sEAAsE;gBACtE,oEAAoE;gBACpE,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;gBACxB,OAAO;oBACH,KAAK;oBACL,IAAI;oBACJ,IAAI;oBACJ,KAAK;iBACR,CAAC;YACN;gBACI,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { RequestOptions } from "./http-helpers/index.ts";
|
|
2
|
+
import type { SignedOrder } from "./order-utils/index.ts";
|
|
3
|
+
import type { ClobSigner } from "./signer.ts";
|
|
4
|
+
import type { AcceptQuoteParams, ApiKeyCreds, ApproveOrderParams, CancelRfqQuoteParams, CancelRfqRequestParams, CreateOrderOptions, GetRfqBestQuoteParams, GetRfqQuotesParams, GetRfqRequestsParams, RfqQuote, RfqQuoteResponse, RfqQuotesResponse, RfqRequestResponse, RfqRequestsResponse, RfqUserOrder, RfqUserQuote, TickSize, UserOrder } from "./types.ts";
|
|
5
|
+
/**
|
|
6
|
+
* Minimal surface from the core CLOB client that RFQ functionality depends on.
|
|
7
|
+
*/
|
|
8
|
+
export interface RfqDeps {
|
|
9
|
+
host: string;
|
|
10
|
+
signer?: ClobSigner;
|
|
11
|
+
creds?: ApiKeyCreds;
|
|
12
|
+
useServerTime?: boolean;
|
|
13
|
+
geoBlockToken?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Numeric user type (backed by SignatureType in the order builder).
|
|
16
|
+
*/
|
|
17
|
+
userType: number;
|
|
18
|
+
getServerTime(): Promise<number>;
|
|
19
|
+
getTickSize(tokenID: string): Promise<TickSize>;
|
|
20
|
+
resolveTickSize(tokenID: string, tickSize?: TickSize): Promise<TickSize>;
|
|
21
|
+
createOrder(userOrder: UserOrder, options?: Partial<CreateOrderOptions>): Promise<SignedOrder>;
|
|
22
|
+
get(endpoint: string, options?: RequestOptions): Promise<any>;
|
|
23
|
+
post(endpoint: string, options?: RequestOptions): Promise<any>;
|
|
24
|
+
put(endpoint: string, options?: RequestOptions): Promise<any>;
|
|
25
|
+
del(endpoint: string, options?: RequestOptions): Promise<any>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Public RFQ surface exposed from a CLOB client.
|
|
29
|
+
*
|
|
30
|
+
* This is what `ClobClient.rfq` is typed as, and what `RfqClient` implements.
|
|
31
|
+
*/
|
|
32
|
+
export interface IRfqClient {
|
|
33
|
+
createRfqRequest(userOrder: RfqUserOrder, options?: Partial<CreateOrderOptions>): Promise<RfqRequestResponse>;
|
|
34
|
+
cancelRfqRequest(request: CancelRfqRequestParams): Promise<"OK">;
|
|
35
|
+
getRfqRequests(params?: GetRfqRequestsParams): Promise<RfqRequestsResponse>;
|
|
36
|
+
createRfqQuote(userQuote: RfqUserQuote, options?: Partial<CreateOrderOptions>): Promise<RfqQuoteResponse>;
|
|
37
|
+
getRfqRequesterQuotes(params?: GetRfqQuotesParams): Promise<RfqQuotesResponse>;
|
|
38
|
+
getRfqQuoterQuotes(params?: GetRfqQuotesParams): Promise<RfqQuotesResponse>;
|
|
39
|
+
getRfqBestQuote(params?: GetRfqBestQuoteParams): Promise<RfqQuote>;
|
|
40
|
+
cancelRfqQuote(quote: CancelRfqQuoteParams): Promise<"OK">;
|
|
41
|
+
rfqConfig(): Promise<any>;
|
|
42
|
+
acceptRfqQuote(payload: AcceptQuoteParams): Promise<"OK">;
|
|
43
|
+
approveRfqOrder(payload: ApproveOrderParams): Promise<"OK">;
|
|
44
|
+
}
|
package/dist/rfq-deps.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rfq-deps.js","sourceRoot":"","sources":["../src/rfq-deps.ts"],"names":[],"mappings":""}
|
package/dist/signer.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Address, WalletClient } from "viem";
|
|
2
|
+
type TypedDataDomain = Record<string, unknown>;
|
|
3
|
+
type TypedDataTypes = Record<string, Array<{
|
|
4
|
+
name: string;
|
|
5
|
+
type: string;
|
|
6
|
+
}>>;
|
|
7
|
+
type TypedDataValue = Record<string, unknown>;
|
|
8
|
+
interface EthersSigner {
|
|
9
|
+
_signTypedData(domain: TypedDataDomain, types: TypedDataTypes, value: TypedDataValue): Promise<string>;
|
|
10
|
+
getAddress(): Promise<string>;
|
|
11
|
+
}
|
|
12
|
+
export type ClobSigner = EthersSigner | WalletClient;
|
|
13
|
+
export declare const getWalletClientAddress: (walletClient: WalletClient) => Promise<Address>;
|
|
14
|
+
export declare const getSignerAddress: (signer: ClobSigner) => Promise<string>;
|
|
15
|
+
export declare const signTypedDataWithSigner: ({ signer, domain, types, value, primaryType, }: {
|
|
16
|
+
signer: ClobSigner;
|
|
17
|
+
domain: TypedDataDomain;
|
|
18
|
+
types: TypedDataTypes;
|
|
19
|
+
value: TypedDataValue;
|
|
20
|
+
primaryType?: string;
|
|
21
|
+
}) => Promise<string>;
|
|
22
|
+
export {};
|
package/dist/signer.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const isEthersTypedDataSigner = (signer) =>
|
|
2
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
3
|
+
typeof signer._signTypedData === "function";
|
|
4
|
+
const isWalletClientSigner = (signer) => typeof signer.signTypedData === "function";
|
|
5
|
+
export const getWalletClientAddress = async (walletClient) => {
|
|
6
|
+
const accountAddress = walletClient.account?.address;
|
|
7
|
+
if (typeof accountAddress === "string" && accountAddress.length > 0) {
|
|
8
|
+
return accountAddress;
|
|
9
|
+
}
|
|
10
|
+
if (typeof walletClient.requestAddresses === "function") {
|
|
11
|
+
const [address] = await walletClient.requestAddresses();
|
|
12
|
+
if (typeof address === "string" && address.length > 0) {
|
|
13
|
+
return address;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (typeof walletClient.getAddresses === "function") {
|
|
17
|
+
const [address] = await walletClient.getAddresses();
|
|
18
|
+
if (typeof address === "string" && address.length > 0) {
|
|
19
|
+
return address;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
throw new Error("wallet client is missing account address");
|
|
23
|
+
};
|
|
24
|
+
export const getSignerAddress = async (signer) => {
|
|
25
|
+
if (isEthersTypedDataSigner(signer)) {
|
|
26
|
+
return signer.getAddress();
|
|
27
|
+
}
|
|
28
|
+
if (isWalletClientSigner(signer)) {
|
|
29
|
+
return getWalletClientAddress(signer);
|
|
30
|
+
}
|
|
31
|
+
throw new Error("unsupported signer type");
|
|
32
|
+
};
|
|
33
|
+
export const signTypedDataWithSigner = async ({ signer, domain, types, value, primaryType, }) => {
|
|
34
|
+
if (isEthersTypedDataSigner(signer)) {
|
|
35
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
36
|
+
return signer._signTypedData(domain, types, value);
|
|
37
|
+
}
|
|
38
|
+
if (isWalletClientSigner(signer)) {
|
|
39
|
+
const account = signer.account ?? (await getWalletClientAddress(signer));
|
|
40
|
+
return signer.signTypedData({
|
|
41
|
+
account,
|
|
42
|
+
domain,
|
|
43
|
+
types,
|
|
44
|
+
primaryType,
|
|
45
|
+
message: value,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
throw new Error("unsupported signer type");
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../src/signer.ts"],"names":[],"mappings":"AAiBA,MAAM,uBAAuB,GAAG,CAAC,MAAkB,EAA0B,EAAE;AAC3E,gDAAgD;AAChD,OAAQ,MAAuB,CAAC,cAAc,KAAK,UAAU,CAAC;AAElE,MAAM,oBAAoB,GAAG,CAAC,MAAkB,EAA0B,EAAE,CACxE,OAAQ,MAAuB,CAAC,aAAa,KAAK,UAAU,CAAC;AAEjE,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EAAE,YAA0B,EAAoB,EAAE;IACzF,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;IACrD,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,cAAyB,CAAC;IACrC,CAAC;IAED,IAAI,OAAO,YAAY,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,YAAY,CAAC,gBAAgB,EAAE,CAAC;QACxD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,OAAO,OAAkB,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,IAAI,OAAO,YAAY,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,YAAY,CAAC,YAAY,EAAE,CAAC;QACpD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,OAAO,OAAkB,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAChE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,MAAkB,EAAmB,EAAE;IAC1E,IAAI,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,EAC1C,MAAM,EACN,MAAM,EACN,KAAK,EACL,KAAK,EACL,WAAW,GAOd,EAAmB,EAAE;IAClB,IAAI,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,gDAAgD;QAChD,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAsB,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5F,OAAO,MAAM,CAAC,aAAa,CAAC;YACxB,OAAO;YACP,MAAM;YACN,KAAK;YACL,WAAW;YACX,OAAO,EAAE,KAAK;SAC+B,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC/C,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const CLOB_DOMAIN_NAME = "ClobAuthDomain";
|
|
2
|
+
export declare const CLOB_VERSION = "1";
|
|
3
|
+
export declare const MSG_TO_SIGN = "This message attests that I control the given wallet";
|
|
4
|
+
export declare const CLOB_DOMAIN: {
|
|
5
|
+
name: string;
|
|
6
|
+
version: string;
|
|
7
|
+
chainId: number;
|
|
8
|
+
};
|
|
9
|
+
export declare const CLOB_TYPES: {
|
|
10
|
+
ClobAuth: {
|
|
11
|
+
name: string;
|
|
12
|
+
type: string;
|
|
13
|
+
}[];
|
|
14
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const CLOB_DOMAIN_NAME = "ClobAuthDomain";
|
|
2
|
+
export const CLOB_VERSION = "1";
|
|
3
|
+
export const MSG_TO_SIGN = "This message attests that I control the given wallet";
|
|
4
|
+
export const CLOB_DOMAIN = {
|
|
5
|
+
name: CLOB_DOMAIN_NAME,
|
|
6
|
+
version: CLOB_VERSION,
|
|
7
|
+
chainId: 1,
|
|
8
|
+
};
|
|
9
|
+
export const CLOB_TYPES = {
|
|
10
|
+
ClobAuth: [
|
|
11
|
+
{ name: "address", type: "address" },
|
|
12
|
+
{ name: "timestamp", type: "string" },
|
|
13
|
+
{ name: "message", type: "string" },
|
|
14
|
+
],
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/signing/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AACjD,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC;AAChC,MAAM,CAAC,MAAM,WAAW,GAAG,sDAAsD,CAAC;AAElF,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,CAAC;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG;IACtB,QAAQ,EAAE;QACN,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;QACpC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE;QACrC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;KACtC;CACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ClobSigner } from "../signer.ts";
|
|
2
|
+
import type { Chain } from "../types.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Builds the canonical Kuest CLOB EIP712 signature
|
|
5
|
+
* @param signer
|
|
6
|
+
* @param ts
|
|
7
|
+
* @returns string
|
|
8
|
+
*/
|
|
9
|
+
export declare const buildClobEip712Signature: (signer: ClobSigner, chainId: Chain, timestamp: number, nonce: number) => Promise<string>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { getSignerAddress, signTypedDataWithSigner } from "../signer.js";
|
|
2
|
+
import { MSG_TO_SIGN } from "./constants.js";
|
|
3
|
+
/**
|
|
4
|
+
* Builds the canonical Kuest CLOB EIP712 signature
|
|
5
|
+
* @param signer
|
|
6
|
+
* @param ts
|
|
7
|
+
* @returns string
|
|
8
|
+
*/
|
|
9
|
+
export const buildClobEip712Signature = async (signer, chainId, timestamp, nonce) => {
|
|
10
|
+
const address = await getSignerAddress(signer);
|
|
11
|
+
const ts = `${timestamp}`;
|
|
12
|
+
const domain = {
|
|
13
|
+
name: "ClobAuthDomain",
|
|
14
|
+
version: "1",
|
|
15
|
+
chainId: chainId,
|
|
16
|
+
};
|
|
17
|
+
const types = {
|
|
18
|
+
ClobAuth: [
|
|
19
|
+
{ name: "address", type: "address" },
|
|
20
|
+
{ name: "timestamp", type: "string" },
|
|
21
|
+
{ name: "nonce", type: "uint256" },
|
|
22
|
+
{ name: "message", type: "string" },
|
|
23
|
+
],
|
|
24
|
+
};
|
|
25
|
+
const value = {
|
|
26
|
+
address,
|
|
27
|
+
timestamp: ts,
|
|
28
|
+
nonce,
|
|
29
|
+
message: MSG_TO_SIGN,
|
|
30
|
+
};
|
|
31
|
+
const sig = await signTypedDataWithSigner({
|
|
32
|
+
signer,
|
|
33
|
+
domain,
|
|
34
|
+
types,
|
|
35
|
+
value,
|
|
36
|
+
primaryType: "ClobAuth",
|
|
37
|
+
});
|
|
38
|
+
return sig;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=eip712.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eip712.js","sourceRoot":"","sources":["../../src/signing/eip712.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EACzC,MAAkB,EAClB,OAAc,EACd,SAAiB,EACjB,KAAa,EACE,EAAE;IACjB,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,GAAG,SAAS,EAAE,CAAC;IAE1B,MAAM,MAAM,GAAG;QACX,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE,OAAO;KACnB,CAAC;IAEF,MAAM,KAAK,GAAG;QACV,QAAQ,EAAE;YACN,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;YACpC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE;YACrC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;YAClC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;SACtC;KACJ,CAAC;IACF,MAAM,KAAK,GAAG;QACV,OAAO;QACP,SAAS,EAAE,EAAE;QACb,KAAK;QACL,OAAO,EAAE,WAAW;KACvB,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,uBAAuB,CAAC;QACtC,MAAM;QACN,MAAM;QACN,KAAK;QACL,KAAK;QACL,WAAW,EAAE,UAAU;KAC1B,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACf,CAAC,CAAC"}
|