@1stdex/first-sdk 1.0.35 → 1.0.37
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/cjs/calls/market/limit.js +28 -8
- package/dist/cjs/calls/market/limit.js.map +1 -1
- package/dist/cjs/views/index.js +2 -1
- package/dist/cjs/views/index.js.map +1 -1
- package/dist/cjs/views/market/index.js +3 -1
- package/dist/cjs/views/market/index.js.map +1 -1
- package/dist/cjs/views/market/limit-order-result.js +232 -0
- package/dist/cjs/views/market/limit-order-result.js.map +1 -0
- package/dist/esm/calls/market/limit.js +29 -8
- package/dist/esm/calls/market/limit.js.map +1 -1
- package/dist/esm/views/index.js +1 -1
- package/dist/esm/views/index.js.map +1 -1
- package/dist/esm/views/market/index.js +1 -0
- package/dist/esm/views/market/index.js.map +1 -1
- package/dist/esm/views/market/limit-order-result.js +277 -0
- package/dist/esm/views/market/limit-order-result.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/calls/market/limit.d.ts +2 -0
- package/dist/types/calls/market/limit.d.ts.map +1 -1
- package/dist/types/views/index.d.ts +1 -1
- package/dist/types/views/index.d.ts.map +1 -1
- package/dist/types/views/market/index.d.ts +1 -0
- package/dist/types/views/market/index.d.ts.map +1 -1
- package/dist/types/views/market/limit-order-result.d.ts +41 -0
- package/dist/types/views/market/limit-order-result.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { createPublicClient, formatUnits, getAddress, http, isAddressEqual, parseEventLogs, } from 'viem';
|
|
2
|
+
import { BOOK_MANAGER_ABI } from '../../constants/abis/core/book-manager-abi';
|
|
3
|
+
import { CHAIN_MAP } from '../../constants/chain-configs/chain';
|
|
4
|
+
import { Subgraph } from '../../constants/chain-configs/subgraph';
|
|
5
|
+
import { formatPrice, invertTick, toPrice } from '../../utils';
|
|
6
|
+
import { getMarketId } from '../../entities/market/utils/market-id';
|
|
7
|
+
import { quoteToBase, baseToQuote } from '../../utils/conversion';
|
|
8
|
+
const fetchBookInfo = async (chainId, bookId) => {
|
|
9
|
+
const { data: { book }, } = await Subgraph.get(chainId, 'getBookForLimitOrderResult', 'query getBookForLimitOrderResult($bookId: ID!) { book(id: $bookId) { id unitSize base { id name symbol decimals } quote { id name symbol decimals } } }', {
|
|
10
|
+
bookId: bookId.toString(),
|
|
11
|
+
});
|
|
12
|
+
if (!book) {
|
|
13
|
+
throw new Error(`Book not found: ${bookId}`);
|
|
14
|
+
}
|
|
15
|
+
return book;
|
|
16
|
+
};
|
|
17
|
+
const toCurrency = (currencyDto) => ({
|
|
18
|
+
address: getAddress(currencyDto.id),
|
|
19
|
+
name: currencyDto.name,
|
|
20
|
+
symbol: currencyDto.symbol,
|
|
21
|
+
decimals: Number(currencyDto.decimals),
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Get limit order result from transaction hash
|
|
25
|
+
* @param chainId - chain id from {@link CHAIN_IDS}
|
|
26
|
+
* @param txHash - transaction hash of the limit order placement
|
|
27
|
+
* @param options {@link DefaultReadContractOptions} options.
|
|
28
|
+
* @returns Limit order result with make, taken, and spent flows
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* import { getLimitOrderResult } from '@clober/v2-sdk'
|
|
32
|
+
*
|
|
33
|
+
* const result = await getLimitOrderResult({
|
|
34
|
+
* chainId: 421614,
|
|
35
|
+
* txHash: '0x...',
|
|
36
|
+
* })
|
|
37
|
+
*/
|
|
38
|
+
export const getLimitOrderResult = async ({ chainId, txHash, options, }) => {
|
|
39
|
+
const publicClient = createPublicClient({
|
|
40
|
+
chain: CHAIN_MAP[chainId],
|
|
41
|
+
transport: options?.rpcUrl ? http(options.rpcUrl) : http(),
|
|
42
|
+
});
|
|
43
|
+
const receipt = await publicClient.getTransactionReceipt({ hash: txHash });
|
|
44
|
+
const logs = parseEventLogs({
|
|
45
|
+
abi: BOOK_MANAGER_ABI,
|
|
46
|
+
logs: receipt.logs,
|
|
47
|
+
});
|
|
48
|
+
const makeEvents = logs.filter((log) => log.eventName === 'Make');
|
|
49
|
+
const takeEvents = logs.filter((log) => log.eventName === 'Take');
|
|
50
|
+
if (makeEvents.length === 0 && takeEvents.length === 0) {
|
|
51
|
+
throw new Error('No Make or Take events found in transaction');
|
|
52
|
+
}
|
|
53
|
+
// Get unique bookIds and fetch book info
|
|
54
|
+
const bookIds = new Set([
|
|
55
|
+
...makeEvents.map((e) => e.args.bookId),
|
|
56
|
+
...takeEvents.map((e) => e.args.bookId),
|
|
57
|
+
]);
|
|
58
|
+
const bookInfoMap = new Map();
|
|
59
|
+
await Promise.all(Array.from(bookIds).map(async (bookId) => {
|
|
60
|
+
const info = await fetchBookInfo(chainId, bookId);
|
|
61
|
+
bookInfoMap.set(bookId, info);
|
|
62
|
+
}));
|
|
63
|
+
// Process Make events (if any)
|
|
64
|
+
let makeCurrency = null;
|
|
65
|
+
let makeAmount = '0';
|
|
66
|
+
let makePrice = '0';
|
|
67
|
+
let makeBookBase = null;
|
|
68
|
+
let makeBookQuote = null;
|
|
69
|
+
let isMakeBidBook = false;
|
|
70
|
+
if (makeEvents.length > 0) {
|
|
71
|
+
const makeBookId = makeEvents[0].args.bookId;
|
|
72
|
+
const makeBookInfo = bookInfoMap.get(makeBookId);
|
|
73
|
+
makeBookBase = toCurrency(makeBookInfo.base);
|
|
74
|
+
makeBookQuote = toCurrency(makeBookInfo.quote);
|
|
75
|
+
const makeUnitSize = BigInt(makeBookInfo.unitSize);
|
|
76
|
+
// Determine if Make book is bid or ask
|
|
77
|
+
const { quoteTokenAddress: marketQuoteAddress } = getMarketId(chainId, [
|
|
78
|
+
makeBookBase.address,
|
|
79
|
+
makeBookQuote.address,
|
|
80
|
+
]);
|
|
81
|
+
isMakeBidBook = isAddressEqual(makeBookQuote.address, marketQuoteAddress);
|
|
82
|
+
// Calculate total make amount
|
|
83
|
+
const totalMakeUnits = makeEvents.reduce((sum, e) => sum + e.args.unit, 0n);
|
|
84
|
+
const totalMakeAmount = totalMakeUnits * makeUnitSize;
|
|
85
|
+
// Get make tick (should be same for all Make events in same transaction)
|
|
86
|
+
const makeTick = BigInt(makeEvents[0].args.tick);
|
|
87
|
+
// Calculate make currency and amount
|
|
88
|
+
makeCurrency = isMakeBidBook ? makeBookQuote : makeBookBase;
|
|
89
|
+
makeAmount = formatUnits(totalMakeAmount, makeCurrency.decimals);
|
|
90
|
+
// Calculate make price
|
|
91
|
+
const rawPrice = isMakeBidBook
|
|
92
|
+
? toPrice(makeTick)
|
|
93
|
+
: toPrice(invertTick(makeTick));
|
|
94
|
+
makePrice = formatPrice(rawPrice, makeBookQuote.decimals, makeBookBase.decimals);
|
|
95
|
+
}
|
|
96
|
+
// Process Take events (if any)
|
|
97
|
+
const takeEventsWithInfo = takeEvents.map((e) => {
|
|
98
|
+
const bookInfo = bookInfoMap.get(e.args.bookId);
|
|
99
|
+
const base = toCurrency(bookInfo.base);
|
|
100
|
+
const quote = toCurrency(bookInfo.quote);
|
|
101
|
+
const unitSize = BigInt(bookInfo.unitSize);
|
|
102
|
+
// Determine if Take book is bid or ask
|
|
103
|
+
const { quoteTokenAddress: marketQuoteAddress } = getMarketId(chainId, [
|
|
104
|
+
base.address,
|
|
105
|
+
quote.address,
|
|
106
|
+
]);
|
|
107
|
+
const isTakeBidBook = isAddressEqual(quote.address, marketQuoteAddress);
|
|
108
|
+
const tick = BigInt(e.args.tick);
|
|
109
|
+
const units = e.args.unit;
|
|
110
|
+
const rawAmount = units * unitSize;
|
|
111
|
+
// Calculate price
|
|
112
|
+
const rawPrice = isTakeBidBook ? toPrice(tick) : toPrice(invertTick(tick));
|
|
113
|
+
const price = formatPrice(rawPrice, quote.decimals, base.decimals);
|
|
114
|
+
// Calculate taken and spent amounts
|
|
115
|
+
let takenAmount;
|
|
116
|
+
let spentAmount;
|
|
117
|
+
let takenCurrency;
|
|
118
|
+
let spentCurrency;
|
|
119
|
+
if (isTakeBidBook) {
|
|
120
|
+
// Bid book: taking means receiving base, spending quote
|
|
121
|
+
takenAmount = quoteToBase(tick, rawAmount, false);
|
|
122
|
+
spentAmount = rawAmount;
|
|
123
|
+
takenCurrency = base;
|
|
124
|
+
spentCurrency = quote;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// Ask book: taking means receiving quote, spending base
|
|
128
|
+
takenAmount = rawAmount;
|
|
129
|
+
spentAmount = baseToQuote(invertTick(tick), rawAmount, false);
|
|
130
|
+
takenCurrency = quote;
|
|
131
|
+
spentCurrency = base;
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
price,
|
|
135
|
+
takenAmount: formatUnits(takenAmount, takenCurrency.decimals),
|
|
136
|
+
spentAmount: formatUnits(spentAmount, spentCurrency.decimals),
|
|
137
|
+
takenCurrency,
|
|
138
|
+
spentCurrency,
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
// Group by currency and calculate totals
|
|
142
|
+
const takenEventsMap = new Map();
|
|
143
|
+
const spentEventsMap = new Map();
|
|
144
|
+
takeEventsWithInfo.forEach((event) => {
|
|
145
|
+
const takenKey = event.takenCurrency.address;
|
|
146
|
+
const spentKey = event.spentCurrency.address;
|
|
147
|
+
if (!takenEventsMap.has(takenKey)) {
|
|
148
|
+
takenEventsMap.set(takenKey, []);
|
|
149
|
+
}
|
|
150
|
+
if (!spentEventsMap.has(spentKey)) {
|
|
151
|
+
spentEventsMap.set(spentKey, []);
|
|
152
|
+
}
|
|
153
|
+
takenEventsMap.get(takenKey).push({
|
|
154
|
+
price: event.price,
|
|
155
|
+
amount: event.takenAmount,
|
|
156
|
+
});
|
|
157
|
+
spentEventsMap.get(spentKey).push({
|
|
158
|
+
price: event.price,
|
|
159
|
+
amount: event.spentAmount,
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
// Calculate totals and averages
|
|
163
|
+
const calculateTotalAndAverage = (events) => {
|
|
164
|
+
if (events.length === 0) {
|
|
165
|
+
return { total: '0', averagePrice: '0' };
|
|
166
|
+
}
|
|
167
|
+
const total = events.reduce((sum, e) => sum + Number(e.amount), 0);
|
|
168
|
+
const totalWeightedPrice = events.reduce((sum, e) => sum + Number(e.price) * Number(e.amount), 0);
|
|
169
|
+
const averagePrice = total === 0 ? '0' : (totalWeightedPrice / total).toString();
|
|
170
|
+
return { total: total.toString(), averagePrice };
|
|
171
|
+
};
|
|
172
|
+
// Determine taken and spent currencies
|
|
173
|
+
let takenCurrency;
|
|
174
|
+
let spentCurrency;
|
|
175
|
+
let takenEvents = [];
|
|
176
|
+
let spentEvents = [];
|
|
177
|
+
if (makeEvents.length > 0 && makeCurrency && makeBookBase && makeBookQuote) {
|
|
178
|
+
// We have Make events, so we know the expected currencies
|
|
179
|
+
// For a limit order:
|
|
180
|
+
// - make.currency = inputCurrency (what's being placed in the order)
|
|
181
|
+
// - spent.currency = inputCurrency (what was spent immediately)
|
|
182
|
+
// - taken.currency = outputCurrency (what was received immediately)
|
|
183
|
+
//
|
|
184
|
+
// If Make is bid: spending quote, making base order -> spent=quote, taken=base
|
|
185
|
+
// If Make is ask: spending base, making quote order -> spent=base, taken=quote
|
|
186
|
+
const expectedSpentCurrency = makeCurrency; // Same as make currency
|
|
187
|
+
const expectedTakenCurrency = isMakeBidBook ? makeBookBase : makeBookQuote; // Opposite of make currency
|
|
188
|
+
// Find matching currencies from Take events
|
|
189
|
+
takenCurrency = expectedTakenCurrency;
|
|
190
|
+
spentCurrency = expectedSpentCurrency;
|
|
191
|
+
// Try to find events matching expected currencies
|
|
192
|
+
for (const [currencyKey, events] of takenEventsMap.entries()) {
|
|
193
|
+
const currency = takeEventsWithInfo.find((e) => e.takenCurrency.address === currencyKey).takenCurrency;
|
|
194
|
+
if (isAddressEqual(currency.address, expectedTakenCurrency.address)) {
|
|
195
|
+
takenCurrency = currency;
|
|
196
|
+
takenEvents = events;
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
for (const [currencyKey, events] of spentEventsMap.entries()) {
|
|
201
|
+
const currency = takeEventsWithInfo.find((e) => e.spentCurrency.address === currencyKey).spentCurrency;
|
|
202
|
+
if (isAddressEqual(currency.address, expectedSpentCurrency.address)) {
|
|
203
|
+
spentCurrency = currency;
|
|
204
|
+
spentEvents = events;
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Fallback: use first currency if not found
|
|
209
|
+
if (takenEvents.length === 0 && takenEventsMap.size > 0) {
|
|
210
|
+
const firstKey = Array.from(takenEventsMap.keys())[0];
|
|
211
|
+
takenCurrency = takeEventsWithInfo.find((e) => e.takenCurrency.address === firstKey).takenCurrency;
|
|
212
|
+
takenEvents = takenEventsMap.get(firstKey);
|
|
213
|
+
}
|
|
214
|
+
if (spentEvents.length === 0 && spentEventsMap.size > 0) {
|
|
215
|
+
const firstKey = Array.from(spentEventsMap.keys())[0];
|
|
216
|
+
spentCurrency = takeEventsWithInfo.find((e) => e.spentCurrency.address === firstKey).spentCurrency;
|
|
217
|
+
spentEvents = spentEventsMap.get(firstKey);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else if (takeEvents.length > 0) {
|
|
221
|
+
// No Make events, but we have Take events - use currencies from Take events
|
|
222
|
+
// Use the most common currencies from Take events
|
|
223
|
+
if (takenEventsMap.size > 0) {
|
|
224
|
+
const firstKey = Array.from(takenEventsMap.keys())[0];
|
|
225
|
+
takenCurrency = takeEventsWithInfo.find((e) => e.takenCurrency.address === firstKey).takenCurrency;
|
|
226
|
+
takenEvents = takenEventsMap.get(firstKey);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
// Fallback: use first Take event currency
|
|
230
|
+
takenCurrency = takeEventsWithInfo[0].takenCurrency;
|
|
231
|
+
}
|
|
232
|
+
if (spentEventsMap.size > 0) {
|
|
233
|
+
const firstKey = Array.from(spentEventsMap.keys())[0];
|
|
234
|
+
spentCurrency = takeEventsWithInfo.find((e) => e.spentCurrency.address === firstKey).spentCurrency;
|
|
235
|
+
spentEvents = spentEventsMap.get(firstKey);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
// Fallback: use first Take event currency
|
|
239
|
+
spentCurrency = takeEventsWithInfo[0].spentCurrency;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
// No events at all (shouldn't happen due to earlier check, but handle it)
|
|
244
|
+
throw new Error('No Make or Take events found in transaction');
|
|
245
|
+
}
|
|
246
|
+
const { total: takenTotal, averagePrice: takenAveragePrice } = calculateTotalAndAverage(takenEvents);
|
|
247
|
+
const { total: spentTotal, averagePrice: spentAveragePrice } = calculateTotalAndAverage(spentEvents);
|
|
248
|
+
// If no Make events, we need to provide a default currency for make
|
|
249
|
+
// Use spent currency as fallback since make and spent are typically the same currency
|
|
250
|
+
const defaultMakeCurrency = makeCurrency || spentCurrency || takeEventsWithInfo[0]?.spentCurrency;
|
|
251
|
+
if (!defaultMakeCurrency) {
|
|
252
|
+
throw new Error('Unable to determine currencies from transaction events');
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
make: {
|
|
256
|
+
currency: makeCurrency || defaultMakeCurrency,
|
|
257
|
+
amount: makeAmount,
|
|
258
|
+
direction: 'in',
|
|
259
|
+
price: makePrice,
|
|
260
|
+
},
|
|
261
|
+
taken: {
|
|
262
|
+
currency: takenCurrency,
|
|
263
|
+
amount: takenTotal,
|
|
264
|
+
direction: 'out',
|
|
265
|
+
events: takenEvents,
|
|
266
|
+
averagePrice: takenAveragePrice,
|
|
267
|
+
},
|
|
268
|
+
spent: {
|
|
269
|
+
currency: spentCurrency,
|
|
270
|
+
amount: spentTotal,
|
|
271
|
+
direction: 'in',
|
|
272
|
+
events: spentEvents,
|
|
273
|
+
averagePrice: spentAveragePrice,
|
|
274
|
+
},
|
|
275
|
+
};
|
|
276
|
+
};
|
|
277
|
+
//# sourceMappingURL=limit-order-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limit-order-result.js","sourceRoot":"","sources":["../../../../src/views/market/limit-order-result.ts"],"names":[],"mappings":"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"}
|