@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.
Files changed (87) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +101 -0
  3. package/dist/client.d.ts +164 -0
  4. package/dist/client.js +967 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/config.d.ts +12 -0
  7. package/dist/config.js +28 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/constants.d.ts +3 -0
  10. package/dist/constants.js +7 -0
  11. package/dist/constants.js.map +1 -0
  12. package/dist/endpoints.d.ts +67 -0
  13. package/dist/endpoints.js +82 -0
  14. package/dist/endpoints.js.map +1 -0
  15. package/dist/errors.d.ts +10 -0
  16. package/dist/errors.js +16 -0
  17. package/dist/errors.js.map +1 -0
  18. package/dist/headers/index.d.ts +6 -0
  19. package/dist/headers/index.js +42 -0
  20. package/dist/headers/index.js.map +1 -0
  21. package/dist/http-helpers/index.d.ts +21 -0
  22. package/dist/http-helpers/index.js +151 -0
  23. package/dist/http-helpers/index.js.map +1 -0
  24. package/dist/index.d.ts +11 -0
  25. package/dist/index.js +10 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/order-builder/builder.d.ts +29 -0
  28. package/dist/order-builder/builder.js +52 -0
  29. package/dist/order-builder/builder.js.map +1 -0
  30. package/dist/order-builder/helpers.d.ts +50 -0
  31. package/dist/order-builder/helpers.js +276 -0
  32. package/dist/order-builder/helpers.js.map +1 -0
  33. package/dist/order-builder/index.d.ts +1 -0
  34. package/dist/order-builder/index.js +2 -0
  35. package/dist/order-builder/index.js.map +1 -0
  36. package/dist/order-utils/exchange.order.builder.d.ts +31 -0
  37. package/dist/order-utils/exchange.order.builder.js +120 -0
  38. package/dist/order-utils/exchange.order.builder.js.map +1 -0
  39. package/dist/order-utils/exchange.order.const.d.ts +13 -0
  40. package/dist/order-utils/exchange.order.const.js +28 -0
  41. package/dist/order-utils/exchange.order.const.js.map +1 -0
  42. package/dist/order-utils/index.d.ts +6 -0
  43. package/dist/order-utils/index.js +7 -0
  44. package/dist/order-utils/index.js.map +1 -0
  45. package/dist/order-utils/model/eip712.model.d.ts +25 -0
  46. package/dist/order-utils/model/eip712.model.js +2 -0
  47. package/dist/order-utils/model/eip712.model.js.map +1 -0
  48. package/dist/order-utils/model/order-side.model.d.ts +4 -0
  49. package/dist/order-utils/model/order-side.model.js +6 -0
  50. package/dist/order-utils/model/order-side.model.js.map +1 -0
  51. package/dist/order-utils/model/order.model.d.ts +112 -0
  52. package/dist/order-utils/model/order.model.js +2 -0
  53. package/dist/order-utils/model/order.model.js.map +1 -0
  54. package/dist/order-utils/model/signature-types.model.d.ts +14 -0
  55. package/dist/order-utils/model/signature-types.model.js +16 -0
  56. package/dist/order-utils/model/signature-types.model.js.map +1 -0
  57. package/dist/order-utils/utils.d.ts +1 -0
  58. package/dist/order-utils/utils.js +4 -0
  59. package/dist/order-utils/utils.js.map +1 -0
  60. package/dist/rfq-client.d.ts +64 -0
  61. package/dist/rfq-client.js +403 -0
  62. package/dist/rfq-client.js.map +1 -0
  63. package/dist/rfq-deps.d.ts +44 -0
  64. package/dist/rfq-deps.js +2 -0
  65. package/dist/rfq-deps.js.map +1 -0
  66. package/dist/signer.d.ts +22 -0
  67. package/dist/signer.js +50 -0
  68. package/dist/signer.js.map +1 -0
  69. package/dist/signing/constants.d.ts +14 -0
  70. package/dist/signing/constants.js +16 -0
  71. package/dist/signing/constants.js.map +1 -0
  72. package/dist/signing/eip712.d.ts +9 -0
  73. package/dist/signing/eip712.js +40 -0
  74. package/dist/signing/eip712.js.map +1 -0
  75. package/dist/signing/hmac.d.ts +9 -0
  76. package/dist/signing/hmac.js +58 -0
  77. package/dist/signing/hmac.js.map +1 -0
  78. package/dist/signing/index.d.ts +2 -0
  79. package/dist/signing/index.js +3 -0
  80. package/dist/signing/index.js.map +1 -0
  81. package/dist/types.d.ts +667 -0
  82. package/dist/types.js +37 -0
  83. package/dist/types.js.map +1 -0
  84. package/dist/utilities.d.ts +16 -0
  85. package/dist/utilities.js +93 -0
  86. package/dist/utilities.js.map +1 -0
  87. package/package.json +85 -0
@@ -0,0 +1,29 @@
1
+ import type { SignedOrder } from "../order-utils/index.ts";
2
+ import { SignatureType } from "../order-utils/index.ts";
3
+ import type { ClobSigner } from "../signer.ts";
4
+ import type { Chain, CreateOrderOptions, UserMarketOrder, UserOrder } from "../types.ts";
5
+ export declare class OrderBuilder {
6
+ readonly signer: ClobSigner;
7
+ readonly chainId: Chain;
8
+ readonly signatureType: SignatureType;
9
+ readonly funderAddress?: string;
10
+ /**
11
+ * Optional function to dynamically resolve the signer.
12
+ * If provided, this function will be called to obtain a fresh signer instance
13
+ * (e.g., for smart contract wallets or when the signer may change).
14
+ * Should return an ethers-compatible signer or WalletClient, or a Promise resolving to one.
15
+ * If not provided, the static `signer` property is used.
16
+ */
17
+ private getSigner?;
18
+ constructor(signer: ClobSigner, chainId: Chain, signatureType?: SignatureType, funderAddress?: string, getSigner?: () => Promise<ClobSigner> | ClobSigner);
19
+ /**
20
+ * Generate and sign an order
21
+ */
22
+ buildOrder(userOrder: UserOrder, options: CreateOrderOptions): Promise<SignedOrder>;
23
+ /**
24
+ * Generate and sign a market order
25
+ */
26
+ buildMarketOrder(userMarketOrder: UserMarketOrder, options: CreateOrderOptions): Promise<SignedOrder>;
27
+ /** Unified getter: use fresh signer if available */
28
+ private resolveSigner;
29
+ }
@@ -0,0 +1,52 @@
1
+ import { SignatureType } from "../order-utils/index.js";
2
+ import { createMarketOrder, createOrder } from "./helpers.js";
3
+ export class OrderBuilder {
4
+ signer;
5
+ chainId;
6
+ // Signature type used sign orders, defaults to EOA type
7
+ signatureType;
8
+ // Address which holds funds to be used.
9
+ // Used for Kuest proxy wallets and other smart contract wallets
10
+ // If not provided, funderAddress is the signer address
11
+ funderAddress;
12
+ /**
13
+ * Optional function to dynamically resolve the signer.
14
+ * If provided, this function will be called to obtain a fresh signer instance
15
+ * (e.g., for smart contract wallets or when the signer may change).
16
+ * Should return an ethers-compatible signer or WalletClient, or a Promise resolving to one.
17
+ * If not provided, the static `signer` property is used.
18
+ */
19
+ getSigner;
20
+ constructor(signer, chainId, signatureType, funderAddress, getSigner) {
21
+ this.signer = signer;
22
+ this.chainId = chainId;
23
+ this.signatureType = signatureType === undefined ? SignatureType.EOA : signatureType;
24
+ this.funderAddress = funderAddress;
25
+ this.getSigner = getSigner;
26
+ }
27
+ /**
28
+ * Generate and sign an order
29
+ */
30
+ async buildOrder(userOrder, options) {
31
+ const signer = await this.resolveSigner();
32
+ return createOrder(signer, this.chainId, this.signatureType, this.funderAddress, userOrder, options);
33
+ }
34
+ /**
35
+ * Generate and sign a market order
36
+ */
37
+ async buildMarketOrder(userMarketOrder, options) {
38
+ const signer = await this.resolveSigner();
39
+ return createMarketOrder(signer, this.chainId, this.signatureType, this.funderAddress, userMarketOrder, options);
40
+ }
41
+ /** Unified getter: use fresh signer if available */
42
+ async resolveSigner() {
43
+ if (this.getSigner) {
44
+ const s = await this.getSigner();
45
+ if (!s)
46
+ throw new Error("getSigner() function returned undefined or null");
47
+ return s;
48
+ }
49
+ return this.signer;
50
+ }
51
+ }
52
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/order-builder/builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,OAAO,YAAY;IACZ,MAAM,CAAa;IAEnB,OAAO,CAAQ;IAExB,wDAAwD;IAC/C,aAAa,CAAgB;IAEtC,wCAAwC;IACxC,gEAAgE;IAChE,uDAAuD;IAC9C,aAAa,CAAU;IAEhC;;;;;;OAMG;IACK,SAAS,CAA0C;IAE3D,YACI,MAAkB,EAClB,OAAc,EACd,aAA6B,EAC7B,aAAsB,EACtB,SAAkD;QAElD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC;QACrF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,UAAU,CACnB,SAAoB,EACpB,OAA2B;QAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,OAAO,WAAW,CACd,MAAM,EACN,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,aAAa,EAClB,SAAS,EACT,OAAO,CACV,CAAC;IACN,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,gBAAgB,CACzB,eAAgC,EAChC,OAA2B;QAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,OAAO,iBAAiB,CACpB,MAAM,EACN,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,aAAa,EAClB,eAAe,EACf,OAAO,CACV,CAAC;IACN,CAAC;IAED,oDAAoD;IAC5C,KAAK,CAAC,aAAa;QACvB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YAC3E,OAAO,CAAC,CAAC;QACb,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;CACJ"}
@@ -0,0 +1,50 @@
1
+ import type { OrderData, SignedOrder } from "../order-utils/index.ts";
2
+ import { type SignatureType, Side as UtilsSide } from "../order-utils/index.ts";
3
+ import type { ClobSigner } from "../signer.ts";
4
+ import type { Chain, CreateOrderOptions, OrderSummary, RoundConfig, TickSize, UserMarketOrder, UserOrder } from "../types.ts";
5
+ import { OrderType, Side } from "../types.ts";
6
+ export declare const ROUNDING_CONFIG: Record<TickSize, RoundConfig>;
7
+ /**
8
+ * Generate and sign an order
9
+ *
10
+ * @param signer
11
+ * @param exchangeAddress ctf exchange contract address
12
+ * @param chainId
13
+ * @param OrderData
14
+ * @returns SignedOrder
15
+ */
16
+ export declare const buildOrder: (signer: ClobSigner, exchangeAddress: string, chainId: number, orderData: OrderData) => Promise<SignedOrder>;
17
+ export declare const getOrderRawAmounts: (side: Side, size: number, price: number, roundConfig: RoundConfig) => {
18
+ side: UtilsSide;
19
+ rawMakerAmt: number;
20
+ rawTakerAmt: number;
21
+ };
22
+ /**
23
+ * Translate simple user order to args used to generate Orders
24
+ */
25
+ export declare const buildOrderCreationArgs: (signer: string, maker: string, signatureType: SignatureType, userOrder: UserOrder, roundConfig: RoundConfig) => Promise<OrderData>;
26
+ export declare const createOrder: (eoaSigner: ClobSigner, chainId: Chain, signatureType: SignatureType, funderAddress: string | undefined, userOrder: UserOrder, options: CreateOrderOptions) => Promise<SignedOrder>;
27
+ export declare const getMarketOrderRawAmounts: (side: Side, amount: number, price: number, roundConfig: RoundConfig) => {
28
+ side: UtilsSide;
29
+ rawMakerAmt: number;
30
+ rawTakerAmt: number;
31
+ };
32
+ /**
33
+ * Translate simple user market order to args used to generate Orders
34
+ */
35
+ export declare const buildMarketOrderCreationArgs: (signer: string, maker: string, signatureType: SignatureType, userMarketOrder: UserMarketOrder, roundConfig: RoundConfig) => Promise<OrderData>;
36
+ export declare const createMarketOrder: (eoaSigner: ClobSigner, chainId: Chain, signatureType: SignatureType, funderAddress: string | undefined, userMarketOrder: UserMarketOrder, options: CreateOrderOptions) => Promise<SignedOrder>;
37
+ /**
38
+ * calculateBuyMarketPrice calculates the market price to buy a $$ amount
39
+ * @param positions
40
+ * @param amountToMatch worth to buy
41
+ * @returns
42
+ */
43
+ export declare const calculateBuyMarketPrice: (positions: OrderSummary[], amountToMatch: number, orderType: OrderType) => number;
44
+ /**
45
+ * calculateSellMarketPrice calculates the market price to sell a shares
46
+ * @param positions
47
+ * @param amountToMatch sells to share
48
+ * @returns
49
+ */
50
+ export declare const calculateSellMarketPrice: (positions: OrderSummary[], amountToMatch: number, orderType: OrderType) => number;
@@ -0,0 +1,276 @@
1
+ import { parseUnits } from "viem";
2
+ import { COLLATERAL_TOKEN_DECIMALS, getContractConfig } from "../config.js";
3
+ import { ExchangeOrderBuilder, Side as UtilsSide, } from "../order-utils/index.js";
4
+ import { getSignerAddress } from "../signer.js";
5
+ import { OrderType, Side } from "../types.js";
6
+ import { decimalPlaces, roundDown, roundNormal, roundUp } from "../utilities.js";
7
+ export const ROUNDING_CONFIG = {
8
+ "0.1": {
9
+ price: 1,
10
+ size: 2,
11
+ amount: 3,
12
+ },
13
+ "0.01": {
14
+ price: 2,
15
+ size: 2,
16
+ amount: 4,
17
+ },
18
+ "0.001": {
19
+ price: 3,
20
+ size: 2,
21
+ amount: 5,
22
+ },
23
+ "0.0001": {
24
+ price: 4,
25
+ size: 2,
26
+ amount: 6,
27
+ },
28
+ };
29
+ /**
30
+ * Generate and sign an order
31
+ *
32
+ * @param signer
33
+ * @param exchangeAddress ctf exchange contract address
34
+ * @param chainId
35
+ * @param OrderData
36
+ * @returns SignedOrder
37
+ */
38
+ export const buildOrder = async (signer, exchangeAddress, chainId, orderData) => {
39
+ const cTFExchangeOrderBuilder = new ExchangeOrderBuilder(exchangeAddress, chainId, signer);
40
+ return cTFExchangeOrderBuilder.buildSignedOrder(orderData);
41
+ };
42
+ export const getOrderRawAmounts = (side, size, price, roundConfig) => {
43
+ const rawPrice = roundNormal(price, roundConfig.price);
44
+ if (side === Side.BUY) {
45
+ // force 2 decimals places
46
+ const rawTakerAmt = roundDown(size, roundConfig.size);
47
+ let rawMakerAmt = rawTakerAmt * rawPrice;
48
+ if (decimalPlaces(rawMakerAmt) > roundConfig.amount) {
49
+ rawMakerAmt = roundUp(rawMakerAmt, roundConfig.amount + 4);
50
+ if (decimalPlaces(rawMakerAmt) > roundConfig.amount) {
51
+ rawMakerAmt = roundDown(rawMakerAmt, roundConfig.amount);
52
+ }
53
+ }
54
+ return {
55
+ side: UtilsSide.BUY,
56
+ rawMakerAmt,
57
+ rawTakerAmt,
58
+ };
59
+ }
60
+ const rawMakerAmt = roundDown(size, roundConfig.size);
61
+ let rawTakerAmt = rawMakerAmt * rawPrice;
62
+ if (decimalPlaces(rawTakerAmt) > roundConfig.amount) {
63
+ rawTakerAmt = roundUp(rawTakerAmt, roundConfig.amount + 4);
64
+ if (decimalPlaces(rawTakerAmt) > roundConfig.amount) {
65
+ rawTakerAmt = roundDown(rawTakerAmt, roundConfig.amount);
66
+ }
67
+ }
68
+ return {
69
+ side: UtilsSide.SELL,
70
+ rawMakerAmt,
71
+ rawTakerAmt,
72
+ };
73
+ };
74
+ /**
75
+ * Translate simple user order to args used to generate Orders
76
+ */
77
+ export const buildOrderCreationArgs = async (signer, maker, signatureType, userOrder, roundConfig) => {
78
+ const { side, rawMakerAmt, rawTakerAmt } = getOrderRawAmounts(userOrder.side, userOrder.size, userOrder.price, roundConfig);
79
+ const makerAmount = parseUnits(rawMakerAmt.toString(), COLLATERAL_TOKEN_DECIMALS).toString();
80
+ const takerAmount = parseUnits(rawTakerAmt.toString(), COLLATERAL_TOKEN_DECIMALS).toString();
81
+ let taker;
82
+ if (typeof userOrder.taker !== "undefined" && userOrder.taker) {
83
+ taker = userOrder.taker;
84
+ }
85
+ else {
86
+ taker = "0x0000000000000000000000000000000000000000";
87
+ }
88
+ let feeRateBps;
89
+ if (typeof userOrder.feeRateBps !== "undefined" && userOrder.feeRateBps) {
90
+ feeRateBps = userOrder.feeRateBps.toString();
91
+ }
92
+ else {
93
+ feeRateBps = "0";
94
+ }
95
+ let nonce;
96
+ if (typeof userOrder.nonce !== "undefined" && userOrder.nonce) {
97
+ nonce = userOrder.nonce.toString();
98
+ }
99
+ else {
100
+ nonce = "0";
101
+ }
102
+ return {
103
+ maker,
104
+ taker,
105
+ tokenId: userOrder.tokenID,
106
+ makerAmount,
107
+ takerAmount,
108
+ side,
109
+ feeRateBps,
110
+ nonce,
111
+ signer,
112
+ expiration: (userOrder.expiration || 0).toString(),
113
+ signatureType,
114
+ };
115
+ };
116
+ export const createOrder = async (eoaSigner, chainId, signatureType, funderAddress, userOrder, options) => {
117
+ const eoaSignerAddress = await getSignerAddress(eoaSigner);
118
+ // If funder address is not given, use the signer address
119
+ const maker = funderAddress === undefined ? eoaSignerAddress : funderAddress;
120
+ const contractConfig = getContractConfig(chainId);
121
+ const orderData = await buildOrderCreationArgs(eoaSignerAddress, maker, signatureType, userOrder, ROUNDING_CONFIG[options.tickSize]);
122
+ const exchangeContract = options.negRisk
123
+ ? contractConfig.negRiskExchange
124
+ : contractConfig.exchange;
125
+ return buildOrder(eoaSigner, exchangeContract, chainId, orderData);
126
+ };
127
+ export const getMarketOrderRawAmounts = (side, amount, price, roundConfig) => {
128
+ // force 2 decimals places
129
+ const rawPrice = roundDown(price, roundConfig.price);
130
+ if (side === Side.BUY) {
131
+ const rawMakerAmt = roundDown(amount, roundConfig.size);
132
+ let rawTakerAmt = rawMakerAmt / rawPrice;
133
+ if (decimalPlaces(rawTakerAmt) > roundConfig.amount) {
134
+ rawTakerAmt = roundUp(rawTakerAmt, roundConfig.amount + 4);
135
+ if (decimalPlaces(rawTakerAmt) > roundConfig.amount) {
136
+ rawTakerAmt = roundDown(rawTakerAmt, roundConfig.amount);
137
+ }
138
+ }
139
+ return {
140
+ side: UtilsSide.BUY,
141
+ rawMakerAmt,
142
+ rawTakerAmt,
143
+ };
144
+ }
145
+ const rawMakerAmt = roundDown(amount, roundConfig.size);
146
+ let rawTakerAmt = rawMakerAmt * rawPrice;
147
+ if (decimalPlaces(rawTakerAmt) > roundConfig.amount) {
148
+ rawTakerAmt = roundUp(rawTakerAmt, roundConfig.amount + 4);
149
+ if (decimalPlaces(rawTakerAmt) > roundConfig.amount) {
150
+ rawTakerAmt = roundDown(rawTakerAmt, roundConfig.amount);
151
+ }
152
+ }
153
+ return {
154
+ side: UtilsSide.SELL,
155
+ rawMakerAmt,
156
+ rawTakerAmt,
157
+ };
158
+ };
159
+ /**
160
+ * Translate simple user market order to args used to generate Orders
161
+ */
162
+ export const buildMarketOrderCreationArgs = async (signer, maker, signatureType, userMarketOrder, roundConfig) => {
163
+ const { side, rawMakerAmt, rawTakerAmt } = getMarketOrderRawAmounts(userMarketOrder.side, userMarketOrder.amount, userMarketOrder.price || 1, roundConfig);
164
+ const makerAmount = parseUnits(rawMakerAmt.toString(), COLLATERAL_TOKEN_DECIMALS).toString();
165
+ const takerAmount = parseUnits(rawTakerAmt.toString(), COLLATERAL_TOKEN_DECIMALS).toString();
166
+ let taker;
167
+ if (typeof userMarketOrder.taker !== "undefined" && userMarketOrder.taker) {
168
+ taker = userMarketOrder.taker;
169
+ }
170
+ else {
171
+ taker = "0x0000000000000000000000000000000000000000";
172
+ }
173
+ let feeRateBps;
174
+ if (typeof userMarketOrder.feeRateBps !== "undefined" && userMarketOrder.feeRateBps) {
175
+ feeRateBps = userMarketOrder.feeRateBps.toString();
176
+ }
177
+ else {
178
+ feeRateBps = "0";
179
+ }
180
+ let nonce;
181
+ if (typeof userMarketOrder.nonce !== "undefined" && userMarketOrder.nonce) {
182
+ nonce = userMarketOrder.nonce.toString();
183
+ }
184
+ else {
185
+ nonce = "0";
186
+ }
187
+ return {
188
+ maker,
189
+ taker,
190
+ tokenId: userMarketOrder.tokenID,
191
+ makerAmount,
192
+ takerAmount,
193
+ side,
194
+ feeRateBps,
195
+ nonce,
196
+ signer,
197
+ expiration: "0",
198
+ signatureType,
199
+ };
200
+ };
201
+ export const createMarketOrder = async (eoaSigner, chainId, signatureType, funderAddress, userMarketOrder, options) => {
202
+ const eoaSignerAddress = await getSignerAddress(eoaSigner);
203
+ // If funder address is not given, use the signer address
204
+ const maker = funderAddress === undefined ? eoaSignerAddress : funderAddress;
205
+ const contractConfig = getContractConfig(chainId);
206
+ const orderData = await buildMarketOrderCreationArgs(eoaSignerAddress, maker, signatureType, userMarketOrder, ROUNDING_CONFIG[options.tickSize]);
207
+ const exchangeContract = options.negRisk
208
+ ? contractConfig.negRiskExchange
209
+ : contractConfig.exchange;
210
+ return buildOrder(eoaSigner, exchangeContract, chainId, orderData);
211
+ };
212
+ /**
213
+ * calculateBuyMarketPrice calculates the market price to buy a $$ amount
214
+ * @param positions
215
+ * @param amountToMatch worth to buy
216
+ * @returns
217
+ */
218
+ export const calculateBuyMarketPrice = (positions, amountToMatch, orderType) => {
219
+ if (!positions.length) {
220
+ throw new Error("no match");
221
+ }
222
+ let sum = 0;
223
+ /*
224
+ Asks:
225
+ [
226
+ { price: '0.6', size: '100' },
227
+ { price: '0.55', size: '100' },
228
+ { price: '0.5', size: '100' }
229
+ ]
230
+ So, if the amount to match is $150 that will be reached at first position so price will be 0.6
231
+ */
232
+ for (let i = positions.length - 1; i >= 0; i--) {
233
+ const p = positions[i];
234
+ sum += Number.parseFloat(p.size) * Number.parseFloat(p.price);
235
+ if (sum >= amountToMatch) {
236
+ return Number.parseFloat(p.price);
237
+ }
238
+ }
239
+ if (orderType === OrderType.FOK) {
240
+ throw new Error("no match");
241
+ }
242
+ return Number.parseFloat(positions[0].price);
243
+ };
244
+ /**
245
+ * calculateSellMarketPrice calculates the market price to sell a shares
246
+ * @param positions
247
+ * @param amountToMatch sells to share
248
+ * @returns
249
+ */
250
+ export const calculateSellMarketPrice = (positions, amountToMatch, orderType) => {
251
+ if (!positions.length) {
252
+ throw new Error("no match");
253
+ }
254
+ let sum = 0;
255
+ /*
256
+ Bids:
257
+ [
258
+ { price: '0.4', size: '100' },
259
+ { price: '0.45', size: '100' },
260
+ { price: '0.5', size: '100' }
261
+ ]
262
+ So, if the amount to match is 300 that will be reached at the first position so price will be 0.4
263
+ */
264
+ for (let i = positions.length - 1; i >= 0; i--) {
265
+ const p = positions[i];
266
+ sum += Number.parseFloat(p.size);
267
+ if (sum >= amountToMatch) {
268
+ return Number.parseFloat(p.price);
269
+ }
270
+ }
271
+ if (orderType === OrderType.FOK) {
272
+ throw new Error("no match");
273
+ }
274
+ return Number.parseFloat(positions[0].price);
275
+ };
276
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/order-builder/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from "./builder.ts";
@@ -0,0 +1,2 @@
1
+ export * from "./builder.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/order-builder/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { ClobSigner } from "../signer.ts";
2
+ import type { EIP712TypedData } from "./model/eip712.model.ts";
3
+ import type { Order, OrderData, OrderHash, OrderSignature, SignedOrder } from "./model/order.model.ts";
4
+ import { generateOrderSalt } from "./utils.ts";
5
+ export declare class ExchangeOrderBuilder {
6
+ private readonly contractAddress;
7
+ private readonly chainId;
8
+ private readonly signer;
9
+ private readonly generateSalt;
10
+ constructor(contractAddress: string, chainId: number, signer: ClobSigner, generateSalt?: typeof generateOrderSalt);
11
+ /**
12
+ * Build an order object including the signature.
13
+ */
14
+ buildSignedOrder(orderData: OrderData): Promise<SignedOrder>;
15
+ /**
16
+ * Creates an Order object from order data.
17
+ */
18
+ buildOrder({ maker, taker, tokenId, makerAmount, takerAmount, side, feeRateBps, nonce, signer, expiration, signatureType, }: OrderData): Promise<Order>;
19
+ /**
20
+ * Parses an Order object to EIP712 typed data.
21
+ */
22
+ buildOrderTypedData(order: Order): EIP712TypedData;
23
+ /**
24
+ * Generates order signature from EIP712 typed data.
25
+ */
26
+ buildOrderSignature(typedData: EIP712TypedData): Promise<OrderSignature>;
27
+ /**
28
+ * Generates the hash of the order from EIP712 typed data.
29
+ */
30
+ buildOrderHash(orderTypedData: EIP712TypedData): OrderHash;
31
+ }
@@ -0,0 +1,120 @@
1
+ import { hashTypedData } from "viem";
2
+ import { getSignerAddress, signTypedDataWithSigner } from "../signer.js";
3
+ import { EIP712_DOMAIN, ORDER_STRUCTURE, PROTOCOL_NAME, PROTOCOL_VERSION, } from "./exchange.order.const.js";
4
+ import { SignatureType } from "./model/signature-types.model.js";
5
+ import { generateOrderSalt } from "./utils.js";
6
+ export class ExchangeOrderBuilder {
7
+ contractAddress;
8
+ chainId;
9
+ signer;
10
+ generateSalt;
11
+ constructor(contractAddress, chainId, signer, generateSalt = generateOrderSalt) {
12
+ this.contractAddress = contractAddress;
13
+ this.chainId = chainId;
14
+ this.signer = signer;
15
+ this.generateSalt = generateSalt;
16
+ }
17
+ /**
18
+ * Build an order object including the signature.
19
+ */
20
+ async buildSignedOrder(orderData) {
21
+ const order = await this.buildOrder(orderData);
22
+ const orderTypedData = this.buildOrderTypedData(order);
23
+ const orderSignature = await this.buildOrderSignature(orderTypedData);
24
+ return {
25
+ ...order,
26
+ signature: orderSignature,
27
+ };
28
+ }
29
+ /**
30
+ * Creates an Order object from order data.
31
+ */
32
+ async buildOrder({ maker, taker, tokenId, makerAmount, takerAmount, side, feeRateBps, nonce, signer, expiration, signatureType, }) {
33
+ if (typeof signer === "undefined" || !signer) {
34
+ signer = maker;
35
+ }
36
+ const signerAddress = await getSignerAddress(this.signer);
37
+ if (signer !== signerAddress) {
38
+ throw new Error("signer does not match");
39
+ }
40
+ if (typeof expiration === "undefined" || !expiration) {
41
+ expiration = "0";
42
+ }
43
+ if (typeof signatureType === "undefined" || !signatureType) {
44
+ // Default to EOA 712 sig type
45
+ signatureType = SignatureType.EOA;
46
+ }
47
+ return {
48
+ salt: this.generateSalt(),
49
+ maker,
50
+ signer,
51
+ taker,
52
+ tokenId,
53
+ makerAmount,
54
+ takerAmount,
55
+ expiration,
56
+ nonce,
57
+ feeRateBps,
58
+ side,
59
+ signatureType,
60
+ };
61
+ }
62
+ /**
63
+ * Parses an Order object to EIP712 typed data.
64
+ */
65
+ buildOrderTypedData(order) {
66
+ return {
67
+ primaryType: "Order",
68
+ types: {
69
+ EIP712Domain: EIP712_DOMAIN,
70
+ Order: ORDER_STRUCTURE,
71
+ },
72
+ domain: {
73
+ name: PROTOCOL_NAME,
74
+ version: PROTOCOL_VERSION,
75
+ chainId: this.chainId,
76
+ verifyingContract: this.contractAddress,
77
+ },
78
+ message: {
79
+ salt: order.salt,
80
+ maker: order.maker,
81
+ signer: order.signer,
82
+ taker: order.taker,
83
+ tokenId: order.tokenId,
84
+ makerAmount: order.makerAmount,
85
+ takerAmount: order.takerAmount,
86
+ expiration: order.expiration,
87
+ nonce: order.nonce,
88
+ feeRateBps: order.feeRateBps,
89
+ side: order.side,
90
+ signatureType: order.signatureType,
91
+ },
92
+ };
93
+ }
94
+ /**
95
+ * Generates order signature from EIP712 typed data.
96
+ */
97
+ async buildOrderSignature(typedData) {
98
+ const { EIP712Domain: _, ...orderTypes } = typedData.types;
99
+ return signTypedDataWithSigner({
100
+ signer: this.signer,
101
+ domain: typedData.domain,
102
+ types: orderTypes,
103
+ value: typedData.message,
104
+ primaryType: typedData.primaryType,
105
+ });
106
+ }
107
+ /**
108
+ * Generates the hash of the order from EIP712 typed data.
109
+ */
110
+ buildOrderHash(orderTypedData) {
111
+ const { EIP712Domain: _, ...orderTypes } = orderTypedData.types;
112
+ return hashTypedData({
113
+ domain: orderTypedData.domain,
114
+ types: orderTypes,
115
+ primaryType: orderTypedData.primaryType,
116
+ message: orderTypedData.message,
117
+ });
118
+ }
119
+ }
120
+ //# sourceMappingURL=exchange.order.builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchange.order.builder.js","sourceRoot":"","sources":["../../src/order-utils/exchange.order.builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare const PROTOCOL_NAME = "CTF Exchange";
2
+ export declare const PROTOCOL_VERSION = "1";
3
+ export declare const ZX = "0x";
4
+ export declare const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
5
+ export declare const CALL_RESULTS_PREFIX = "CALL_RESULTS_";
6
+ export declare const EIP712_DOMAIN: {
7
+ name: string;
8
+ type: string;
9
+ }[];
10
+ export declare const ORDER_STRUCTURE: {
11
+ name: string;
12
+ type: string;
13
+ }[];
@@ -0,0 +1,28 @@
1
+ // Contract constants.
2
+ export const PROTOCOL_NAME = "CTF Exchange";
3
+ export const PROTOCOL_VERSION = "1";
4
+ export const ZX = "0x";
5
+ export const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
6
+ export const CALL_RESULTS_PREFIX = "CALL_RESULTS_";
7
+ // EIP712 objects
8
+ export const EIP712_DOMAIN = [
9
+ { name: "name", type: "string" },
10
+ { name: "version", type: "string" },
11
+ { name: "chainId", type: "uint256" },
12
+ { name: "verifyingContract", type: "address" },
13
+ ];
14
+ export const ORDER_STRUCTURE = [
15
+ { name: "salt", type: "uint256" },
16
+ { name: "maker", type: "address" },
17
+ { name: "signer", type: "address" },
18
+ { name: "taker", type: "address" },
19
+ { name: "tokenId", type: "uint256" },
20
+ { name: "makerAmount", type: "uint256" },
21
+ { name: "takerAmount", type: "uint256" },
22
+ { name: "expiration", type: "uint256" },
23
+ { name: "nonce", type: "uint256" },
24
+ { name: "feeRateBps", type: "uint256" },
25
+ { name: "side", type: "uint8" },
26
+ { name: "signatureType", type: "uint8" },
27
+ ];
28
+ //# sourceMappingURL=exchange.order.const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exchange.order.const.js","sourceRoot":"","sources":["../../src/order-utils/exchange.order.const.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;AACvB,MAAM,CAAC,MAAM,YAAY,GAAG,4CAA4C,CAAC;AACzE,MAAM,CAAC,MAAM,mBAAmB,GAAG,eAAe,CAAC;AAEnD,iBAAiB;AACjB,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;IAChC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;IACnC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IACpC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE;CACjD,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE;IACjC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;IAClC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;IACnC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;IAClC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IACpC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE;IACxC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE;IACxC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE;IACvC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;IAClC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE;IACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;IAC/B,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE;CAC3C,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./exchange.order.builder.ts";
2
+ export * from "./exchange.order.const.ts";
3
+ export * from "./model/eip712.model.ts";
4
+ export * from "./model/order.model.ts";
5
+ export * from "./model/order-side.model.ts";
6
+ export * from "./model/signature-types.model.ts";