@1stdex/first-sdk 1.0.64 → 1.0.66
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/constants/chain-configs/subgraph.js +2 -2
- package/dist/cjs/constants/chain-configs/subgraph.js.map +1 -1
- package/dist/cjs/entities/trade/apis/index.js +126 -0
- package/dist/cjs/entities/trade/apis/index.js.map +1 -0
- package/dist/cjs/entities/trade/types.js +3 -0
- package/dist/cjs/entities/trade/types.js.map +1 -0
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/views/index.js +5 -1
- package/dist/cjs/views/index.js.map +1 -1
- package/dist/cjs/views/trade-history.js +13 -0
- package/dist/cjs/views/trade-history.js.map +1 -0
- package/dist/cjs/views/user-volume.js +15 -0
- package/dist/cjs/views/user-volume.js.map +1 -0
- package/dist/esm/constants/chain-configs/subgraph.js +2 -2
- package/dist/esm/constants/chain-configs/subgraph.js.map +1 -1
- package/dist/esm/entities/trade/apis/index.js +141 -0
- package/dist/esm/entities/trade/apis/index.js.map +1 -0
- package/dist/esm/entities/trade/types.js +2 -0
- package/dist/esm/entities/trade/types.js.map +1 -0
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/views/index.js +2 -0
- package/dist/esm/views/index.js.map +1 -1
- package/dist/esm/views/trade-history.js +40 -0
- package/dist/esm/views/trade-history.js.map +1 -0
- package/dist/esm/views/user-volume.js +26 -0
- package/dist/esm/views/user-volume.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/entities/trade/apis/index.d.ts +15 -0
- package/dist/types/entities/trade/apis/index.d.ts.map +1 -0
- package/dist/types/entities/trade/types.d.ts +18 -0
- package/dist/types/entities/trade/types.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +1 -0
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/views/index.d.ts +2 -0
- package/dist/types/views/index.d.ts.map +1 -1
- package/dist/types/views/trade-history.d.ts +41 -0
- package/dist/types/views/trade-history.d.ts.map +1 -0
- package/dist/types/views/user-volume.d.ts +21 -0
- package/dist/types/views/user-volume.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -5,7 +5,7 @@ const axios_1 = require("axios");
|
|
|
5
5
|
const chain_1 = require("./chain");
|
|
6
6
|
exports.SUBGRAPH_URL = {
|
|
7
7
|
[chain_1.CHAIN_IDS.BASE_SEPOLIA]: 'https://subgraph.satsuma-prod.com/f890d39dbfc0/spring--767127/1st-dex-base-sepolia/api',
|
|
8
|
-
[chain_1.CHAIN_IDS.BASE]: 'https://subgraph.satsuma-prod.com/
|
|
8
|
+
[chain_1.CHAIN_IDS.BASE]: 'https://subgraph.satsuma-prod.com/f890d39dbfc0/spring--767127/1st-dex-base-mainnet/version/130a014/api',
|
|
9
9
|
[chain_1.CHAIN_IDS.ARBITRUM_SEPOLIA]: 'https://subgraph.satsuma-prod.com/f890d39dbfc0/spring--767127/1st-dex-arbitrum-sepolia/api',
|
|
10
10
|
[chain_1.CHAIN_IDS.ANVIL]: 'http://localhost:8000/subgraphs/name/first-dex-subgraph',
|
|
11
11
|
};
|
|
@@ -15,7 +15,7 @@ class Subgraph {
|
|
|
15
15
|
throw new Error('Unsupported chain for subgraph');
|
|
16
16
|
}
|
|
17
17
|
const response = await axios_1.default.post(exports.SUBGRAPH_URL[chainId], { query, variables, operationName }, {
|
|
18
|
-
timeout:
|
|
18
|
+
timeout: 10_000,
|
|
19
19
|
});
|
|
20
20
|
if (response.status === 200) {
|
|
21
21
|
return response.data;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subgraph.js","sourceRoot":"","sources":["../../../../src/constants/chain-configs/subgraph.ts"],"names":[],"mappings":";;;AAAA,iCAA0B;AAE1B,mCAAoC;AAEvB,QAAA,YAAY,GAAqC;IAC5D,CAAC,iBAAS,CAAC,YAAY,CAAC,EACtB,wFAAwF;IAC1F,CAAC,iBAAS,CAAC,IAAI,CAAC,EACd,
|
|
1
|
+
{"version":3,"file":"subgraph.js","sourceRoot":"","sources":["../../../../src/constants/chain-configs/subgraph.ts"],"names":[],"mappings":";;;AAAA,iCAA0B;AAE1B,mCAAoC;AAEvB,QAAA,YAAY,GAAqC;IAC5D,CAAC,iBAAS,CAAC,YAAY,CAAC,EACtB,wFAAwF;IAC1F,CAAC,iBAAS,CAAC,IAAI,CAAC,EACd,wGAAwG;IAC1G,CAAC,iBAAS,CAAC,gBAAgB,CAAC,EAC1B,4FAA4F;IAC9F,CAAC,iBAAS,CAAC,KAAK,CAAC,EAAE,yDAAyD;CAC7E,CAAC;AAEF,MAAa,QAAQ;IACZ,MAAM,CAAC,KAAK,CAAC,GAAG,CACrB,OAAkB,EAClB,aAAqB,EACrB,KAAa,EACb,SAAa;QAEb,IAAI,CAAC,oBAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,oBAAY,CAAC,OAAO,CAAC,EACrB,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,EACnC;YACE,OAAO,EAAE,MAAM;SAChB,CACF,CAAC;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAE,QAAQ,CAAC,IAAY,CAAC,MAAM,IAAI,sBAAsB,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;CACF;AAxBD,4BAwBC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetchTradeHistoryFromSubgraph = void 0;
|
|
4
|
+
const viem_1 = require("viem");
|
|
5
|
+
const subgraph_1 = require("../../../constants/chain-configs/subgraph");
|
|
6
|
+
const market_id_1 = require("../../market/utils/market-id");
|
|
7
|
+
const toCurrency = (currencyDto) => ({
|
|
8
|
+
address: (0, viem_1.getAddress)(currencyDto.id),
|
|
9
|
+
name: currencyDto.name,
|
|
10
|
+
symbol: currencyDto.symbol,
|
|
11
|
+
decimals: Number(currencyDto.decimals),
|
|
12
|
+
});
|
|
13
|
+
const toTrade = (chainId, tradeDto) => {
|
|
14
|
+
const inputCurrency = toCurrency(tradeDto.inputToken);
|
|
15
|
+
const outputCurrency = toCurrency(tradeDto.outputToken);
|
|
16
|
+
const quote = toCurrency(tradeDto.book.quote);
|
|
17
|
+
const base = toCurrency(tradeDto.book.base);
|
|
18
|
+
const { quoteTokenAddress } = (0, market_id_1.getMarketId)(chainId, [
|
|
19
|
+
base.address,
|
|
20
|
+
quote.address,
|
|
21
|
+
]);
|
|
22
|
+
const isBuy = (0, viem_1.isAddressEqual)(inputCurrency.address, quoteTokenAddress);
|
|
23
|
+
return {
|
|
24
|
+
id: tradeDto.id,
|
|
25
|
+
type: isBuy ? 'buy' : 'sell',
|
|
26
|
+
usdAmount: tradeDto.amountUSD,
|
|
27
|
+
spent: {
|
|
28
|
+
currency: inputCurrency,
|
|
29
|
+
amount: (0, viem_1.formatUnits)(BigInt(tradeDto.inputAmount), inputCurrency.decimals),
|
|
30
|
+
direction: 'out',
|
|
31
|
+
},
|
|
32
|
+
taken: {
|
|
33
|
+
currency: outputCurrency,
|
|
34
|
+
amount: (0, viem_1.formatUnits)(BigInt(tradeDto.outputAmount), outputCurrency.decimals),
|
|
35
|
+
direction: 'in',
|
|
36
|
+
},
|
|
37
|
+
timestamp: Number(tradeDto.timestamp),
|
|
38
|
+
txHash: tradeDto.transaction.id,
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
async function fetchTradeHistoryFromSubgraph(chainId, userAddress, options) {
|
|
42
|
+
const limit = options?.limit || 50;
|
|
43
|
+
const cursor = options?.cursor;
|
|
44
|
+
let whereClause;
|
|
45
|
+
const baseFilters = [`{trader: "${userAddress.toLowerCase()}"}`];
|
|
46
|
+
if (cursor) {
|
|
47
|
+
baseFilters.push(`{timestamp_lt: "${cursor}"}`);
|
|
48
|
+
}
|
|
49
|
+
if (options?.tokenAddresses && options.tokenAddresses.length > 0) {
|
|
50
|
+
const lowercaseTokens = options.tokenAddresses.map((addr) => addr.toLowerCase());
|
|
51
|
+
const tokenFilterConditions = lowercaseTokens
|
|
52
|
+
.map((addr) => `{inputToken: "${addr}"}, {outputToken: "${addr}"}`)
|
|
53
|
+
.join(', ');
|
|
54
|
+
baseFilters.push(`{or: [${tokenFilterConditions}]}`);
|
|
55
|
+
whereClause = `{and: [${baseFilters.join(', ')}]}`;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
if (baseFilters.length > 1) {
|
|
59
|
+
whereClause = `{and: [${baseFilters.join(', ')}]}`;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
whereClause = baseFilters[0];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const fetchLimit = limit + 1;
|
|
66
|
+
const query = `
|
|
67
|
+
query getTradeHistory {
|
|
68
|
+
takes(
|
|
69
|
+
where: ${whereClause}
|
|
70
|
+
orderBy: timestamp
|
|
71
|
+
orderDirection: desc
|
|
72
|
+
first: ${fetchLimit}
|
|
73
|
+
) {
|
|
74
|
+
id
|
|
75
|
+
timestamp
|
|
76
|
+
transaction { id }
|
|
77
|
+
book {
|
|
78
|
+
id
|
|
79
|
+
quote { id name symbol decimals }
|
|
80
|
+
base { id name symbol decimals }
|
|
81
|
+
}
|
|
82
|
+
inputToken { id name symbol decimals }
|
|
83
|
+
outputToken { id name symbol decimals }
|
|
84
|
+
inputAmount
|
|
85
|
+
outputAmount
|
|
86
|
+
amountUSD
|
|
87
|
+
type
|
|
88
|
+
}
|
|
89
|
+
makerFills(
|
|
90
|
+
where: ${whereClause}
|
|
91
|
+
orderBy: timestamp
|
|
92
|
+
orderDirection: desc
|
|
93
|
+
first: ${fetchLimit}
|
|
94
|
+
) {
|
|
95
|
+
id
|
|
96
|
+
timestamp
|
|
97
|
+
transaction { id }
|
|
98
|
+
book {
|
|
99
|
+
id
|
|
100
|
+
quote { id name symbol decimals }
|
|
101
|
+
base { id name symbol decimals }
|
|
102
|
+
}
|
|
103
|
+
inputToken { id name symbol decimals }
|
|
104
|
+
outputToken { id name symbol decimals }
|
|
105
|
+
inputAmount
|
|
106
|
+
outputAmount
|
|
107
|
+
amountUSD
|
|
108
|
+
type
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
`;
|
|
112
|
+
const { data: { takes, makerFills }, } = await subgraph_1.Subgraph.get(chainId, 'getTradeHistory', query, {});
|
|
113
|
+
const allTrades = [...takes, ...makerFills].sort((a, b) => Number(b.timestamp) - Number(a.timestamp));
|
|
114
|
+
const hasNextPage = allTrades.length > limit;
|
|
115
|
+
const trades = allTrades.slice(0, limit);
|
|
116
|
+
const endCursor = trades.length > 0 ? trades[trades.length - 1].timestamp : null;
|
|
117
|
+
return {
|
|
118
|
+
trades: trades.map((trade) => toTrade(chainId, trade)),
|
|
119
|
+
pageInfo: {
|
|
120
|
+
hasNextPage,
|
|
121
|
+
endCursor,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
exports.fetchTradeHistoryFromSubgraph = fetchTradeHistoryFromSubgraph;
|
|
126
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/entities/trade/apis/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/entities/trade/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";;;AAAA,0DAA6D;AAApD,kGAAA,SAAS,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";;;AAAA,0DAA6D;AAApD,kGAAA,SAAS,OAAA;AAiClB,IAAY,mBAaX;AAbD,WAAY,mBAAmB;IAC7B,uCAAgB,CAAA;IAChB,0CAAmB,CAAA;IACnB,yCAAkB,CAAA;IAClB,yCAAkB,CAAA;IAClB,6CAAsB,CAAA;IACtB,4CAAqB,CAAA;IACrB,qCAAc,CAAA;IACd,sCAAe,CAAA;IACf,uCAAgB,CAAA;IAChB,sCAAe,CAAA;IACf,oCAAa,CAAA;IACb,qCAAc,CAAA;AAChB,CAAC,EAbW,mBAAmB,mCAAnB,mBAAmB,QAa9B"}
|
package/dist/cjs/views/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getOrderPositionValue = exports.getBookPositionValue = exports.getOrderSetupStatus = exports.needsVaultDeposit = exports.checkTokenAllowances = exports.getAllBalances = exports.getPortfolioBalance = exports.getTradingBalance = exports.getVault = exports.getReferralSummary = exports.getUserNativeVolume = exports.getTopUsersByNativeVolume = exports.getUserDailyVolumes = exports.getProtocolAnalytics = exports.getLatestPrice = exports.getDailyClosePriceMap = exports.getLatestPriceMap = exports.getStableCurrencies = exports.getCurrencies = exports.getContractAddresses = exports.getSubgraphBlock = exports.getSubgraphBlockNumber = exports.getSubgraphEndpoint = exports.getClaimableOrders = exports.getCancelableOrders = exports.getOpenOrders = exports.getOpenOrder = exports.getPriceNeighborhood = exports.getMakeOrderResult = exports.getLimitOrderResult = exports.parseMakeOrderIdsFromReceipt = exports.getQuoteToken = exports.getMarketSnapshot = exports.getMarketSnapshots = exports.getExpectedInput = exports.getExpectedOutput = exports.getLatestChartLog = exports.getChartLogs = exports.getMarket = void 0;
|
|
3
|
+
exports.getUserVolumeUSD = exports.getTradeHistory = exports.getOrderPositionValue = exports.getBookPositionValue = exports.getOrderSetupStatus = exports.needsVaultDeposit = exports.checkTokenAllowances = exports.getAllBalances = exports.getPortfolioBalance = exports.getTradingBalance = exports.getVault = exports.getReferralSummary = exports.getUserNativeVolume = exports.getTopUsersByNativeVolume = exports.getUserDailyVolumes = exports.getProtocolAnalytics = exports.getLatestPrice = exports.getDailyClosePriceMap = exports.getLatestPriceMap = exports.getStableCurrencies = exports.getCurrencies = exports.getContractAddresses = exports.getSubgraphBlock = exports.getSubgraphBlockNumber = exports.getSubgraphEndpoint = exports.getClaimableOrders = exports.getCancelableOrders = exports.getOpenOrders = exports.getOpenOrder = exports.getPriceNeighborhood = exports.getMakeOrderResult = exports.getLimitOrderResult = exports.parseMakeOrderIdsFromReceipt = exports.getQuoteToken = exports.getMarketSnapshot = exports.getMarketSnapshots = exports.getExpectedInput = exports.getExpectedOutput = exports.getLatestChartLog = exports.getChartLogs = exports.getMarket = void 0;
|
|
4
4
|
var market_1 = require("./market");
|
|
5
5
|
Object.defineProperty(exports, "getMarket", { enumerable: true, get: function () { return market_1.getMarket; } });
|
|
6
6
|
Object.defineProperty(exports, "getChartLogs", { enumerable: true, get: function () { return market_1.getChartLogs; } });
|
|
@@ -52,4 +52,8 @@ var book_1 = require("./book");
|
|
|
52
52
|
Object.defineProperty(exports, "getBookPositionValue", { enumerable: true, get: function () { return book_1.getBookPositionValue; } });
|
|
53
53
|
var order_1 = require("./order");
|
|
54
54
|
Object.defineProperty(exports, "getOrderPositionValue", { enumerable: true, get: function () { return order_1.getOrderPositionValue; } });
|
|
55
|
+
var trade_history_1 = require("./trade-history");
|
|
56
|
+
Object.defineProperty(exports, "getTradeHistory", { enumerable: true, get: function () { return trade_history_1.getTradeHistory; } });
|
|
57
|
+
var user_volume_1 = require("./user-volume");
|
|
58
|
+
Object.defineProperty(exports, "getUserVolumeUSD", { enumerable: true, get: function () { return user_volume_1.getUserVolumeUSD; } });
|
|
55
59
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/views/index.ts"],"names":[],"mappings":";;;AAAA,mCAYkB;AAXhB,mGAAA,SAAS,OAAA;AACT,sGAAA,YAAY,OAAA;AACZ,2GAAA,iBAAiB,OAAA;AACjB,2GAAA,iBAAiB,OAAA;AACjB,0GAAA,gBAAgB,OAAA;AAChB,4GAAA,kBAAkB,OAAA;AAClB,2GAAA,iBAAiB,OAAA;AACjB,uGAAA,aAAa,OAAA;AACb,sHAAA,4BAA4B,OAAA;AAC5B,6GAAA,mBAAmB,OAAA;AACnB,4GAAA,kBAAkB,OAAA;AAGpB,+BAA8C;AAArC,4GAAA,oBAAoB,OAAA;AAC7B,2CAKsB;AAJpB,0GAAA,YAAY,OAAA;AACZ,2GAAA,aAAa,OAAA;AACb,iHAAA,mBAAmB,OAAA;AACnB,gHAAA,kBAAkB,OAAA;AAEpB,uCAIoB;AAHlB,+GAAA,mBAAmB,OAAA;AACnB,kHAAA,sBAAsB,OAAA;AACtB,4GAAA,gBAAgB,OAAA;AAElB,qCAAiD;AAAxC,+GAAA,oBAAoB,OAAA;AAC7B,uCAMoB;AALlB,yGAAA,aAAa,OAAA;AACb,+GAAA,mBAAmB,OAAA;AACnB,6GAAA,iBAAiB,OAAA;AACjB,iHAAA,qBAAqB,OAAA;AACrB,0GAAA,cAAc,OAAA;AAEhB,yCAMqB;AALnB,iHAAA,oBAAoB,OAAA;AACpB,gHAAA,mBAAmB,OAAA;AACnB,sHAAA,yBAAyB,OAAA;AACzB,gHAAA,mBAAmB,OAAA;AACnB,+GAAA,kBAAkB,OAAA;AAEpB,iCAAmC;AAA1B,iGAAA,QAAQ,OAAA;AACjB,qCAImB;AAHjB,4GAAA,iBAAiB,OAAA;AACjB,8GAAA,mBAAmB,OAAA;AACnB,yGAAA,cAAc,OAAA;AAEhB,iCAIiB;AAHf,6GAAA,oBAAoB,OAAA;AACpB,0GAAA,iBAAiB,OAAA;AACjB,4GAAA,mBAAmB,OAAA;AAErB,+BAA8C;AAArC,4GAAA,oBAAoB,OAAA;AAC7B,iCAAgD;AAAvC,8GAAA,qBAAqB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/views/index.ts"],"names":[],"mappings":";;;AAAA,mCAYkB;AAXhB,mGAAA,SAAS,OAAA;AACT,sGAAA,YAAY,OAAA;AACZ,2GAAA,iBAAiB,OAAA;AACjB,2GAAA,iBAAiB,OAAA;AACjB,0GAAA,gBAAgB,OAAA;AAChB,4GAAA,kBAAkB,OAAA;AAClB,2GAAA,iBAAiB,OAAA;AACjB,uGAAA,aAAa,OAAA;AACb,sHAAA,4BAA4B,OAAA;AAC5B,6GAAA,mBAAmB,OAAA;AACnB,4GAAA,kBAAkB,OAAA;AAGpB,+BAA8C;AAArC,4GAAA,oBAAoB,OAAA;AAC7B,2CAKsB;AAJpB,0GAAA,YAAY,OAAA;AACZ,2GAAA,aAAa,OAAA;AACb,iHAAA,mBAAmB,OAAA;AACnB,gHAAA,kBAAkB,OAAA;AAEpB,uCAIoB;AAHlB,+GAAA,mBAAmB,OAAA;AACnB,kHAAA,sBAAsB,OAAA;AACtB,4GAAA,gBAAgB,OAAA;AAElB,qCAAiD;AAAxC,+GAAA,oBAAoB,OAAA;AAC7B,uCAMoB;AALlB,yGAAA,aAAa,OAAA;AACb,+GAAA,mBAAmB,OAAA;AACnB,6GAAA,iBAAiB,OAAA;AACjB,iHAAA,qBAAqB,OAAA;AACrB,0GAAA,cAAc,OAAA;AAEhB,yCAMqB;AALnB,iHAAA,oBAAoB,OAAA;AACpB,gHAAA,mBAAmB,OAAA;AACnB,sHAAA,yBAAyB,OAAA;AACzB,gHAAA,mBAAmB,OAAA;AACnB,+GAAA,kBAAkB,OAAA;AAEpB,iCAAmC;AAA1B,iGAAA,QAAQ,OAAA;AACjB,qCAImB;AAHjB,4GAAA,iBAAiB,OAAA;AACjB,8GAAA,mBAAmB,OAAA;AACnB,yGAAA,cAAc,OAAA;AAEhB,iCAIiB;AAHf,6GAAA,oBAAoB,OAAA;AACpB,0GAAA,iBAAiB,OAAA;AACjB,4GAAA,mBAAmB,OAAA;AAErB,+BAA8C;AAArC,4GAAA,oBAAoB,OAAA;AAC7B,iCAAgD;AAAvC,8GAAA,qBAAqB,OAAA;AAC9B,iDAAkD;AAAzC,gHAAA,eAAe,OAAA;AACxB,6CAAiD;AAAxC,+GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getTradeHistory = void 0;
|
|
4
|
+
const apis_1 = require("../entities/trade/apis");
|
|
5
|
+
const getTradeHistory = async ({ chainId, userAddress, tokenAddresses, limit, cursor, }) => {
|
|
6
|
+
return (0, apis_1.fetchTradeHistoryFromSubgraph)(chainId, userAddress, {
|
|
7
|
+
tokenAddresses: tokenAddresses || [],
|
|
8
|
+
limit,
|
|
9
|
+
cursor,
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
exports.getTradeHistory = getTradeHistory;
|
|
13
|
+
//# sourceMappingURL=trade-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trade-history.js","sourceRoot":"","sources":["../../../src/views/trade-history.ts"],"names":[],"mappings":";;;AAEA,iDAAuE;AAiChE,MAAM,eAAe,GAAG,KAAK,EAAE,EACpC,OAAO,EACP,WAAW,EACX,cAAc,EACd,KAAK,EACL,MAAM,GAOP,EAA+B,EAAE;IAChC,OAAO,IAAA,oCAA6B,EAAC,OAAO,EAAE,WAAW,EAAE;QACzD,cAAc,EAAE,cAAc,IAAI,EAAE;QACpC,KAAK;QACL,MAAM;KACP,CAAC,CAAC;AACL,CAAC,CAAC;AAlBW,QAAA,eAAe,mBAkB1B"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getUserVolumeUSD = void 0;
|
|
4
|
+
const subgraph_1 = require("../constants/chain-configs/subgraph");
|
|
5
|
+
const getUserVolumeUSD = async ({ chainId, userAddress, }) => {
|
|
6
|
+
const { data: { user }, } = await subgraph_1.Subgraph.get(chainId, 'getUserVolume', 'query getUserVolume($userId: ID!) { user(id: $userId) { id volumeUSD nativeVolume firstSeenTimestamp firstSeenBlockNumber } }', {
|
|
7
|
+
userId: userAddress.toLowerCase(),
|
|
8
|
+
});
|
|
9
|
+
if (!user) {
|
|
10
|
+
return '0';
|
|
11
|
+
}
|
|
12
|
+
return user.volumeUSD;
|
|
13
|
+
};
|
|
14
|
+
exports.getUserVolumeUSD = getUserVolumeUSD;
|
|
15
|
+
//# sourceMappingURL=user-volume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-volume.js","sourceRoot":"","sources":["../../../src/views/user-volume.ts"],"names":[],"mappings":";;;AACA,kEAA+D;AAyBxD,MAAM,gBAAgB,GAAG,KAAK,EAAE,EACrC,OAAO,EACP,WAAW,GAIZ,EAAmB,EAAE;IACpB,MAAM,EACJ,IAAI,EAAE,EAAE,IAAI,EAAE,GACf,GAAG,MAAM,mBAAQ,CAAC,GAAG,CAGpB,OAAO,EACP,eAAe,EACf,+HAA+H,EAC/H;QACE,MAAM,EAAE,WAAW,CAAC,WAAW,EAAE;KAClC,CACF,CAAC;IAEF,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC;AACxB,CAAC,CAAC;AAzBW,QAAA,gBAAgB,oBAyB3B"}
|
|
@@ -2,7 +2,7 @@ import axios from 'axios';
|
|
|
2
2
|
import { CHAIN_IDS } from './chain';
|
|
3
3
|
export const SUBGRAPH_URL = {
|
|
4
4
|
[CHAIN_IDS.BASE_SEPOLIA]: 'https://subgraph.satsuma-prod.com/f890d39dbfc0/spring--767127/1st-dex-base-sepolia/api',
|
|
5
|
-
[CHAIN_IDS.BASE]: 'https://subgraph.satsuma-prod.com/
|
|
5
|
+
[CHAIN_IDS.BASE]: 'https://subgraph.satsuma-prod.com/f890d39dbfc0/spring--767127/1st-dex-base-mainnet/version/130a014/api',
|
|
6
6
|
[CHAIN_IDS.ARBITRUM_SEPOLIA]: 'https://subgraph.satsuma-prod.com/f890d39dbfc0/spring--767127/1st-dex-arbitrum-sepolia/api',
|
|
7
7
|
[CHAIN_IDS.ANVIL]: 'http://localhost:8000/subgraphs/name/first-dex-subgraph',
|
|
8
8
|
};
|
|
@@ -12,7 +12,7 @@ export class Subgraph {
|
|
|
12
12
|
throw new Error('Unsupported chain for subgraph');
|
|
13
13
|
}
|
|
14
14
|
const response = await axios.post(SUBGRAPH_URL[chainId], { query, variables, operationName }, {
|
|
15
|
-
timeout:
|
|
15
|
+
timeout: 10_000, // TODO: pass with option
|
|
16
16
|
});
|
|
17
17
|
if (response.status === 200) {
|
|
18
18
|
return response.data;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subgraph.js","sourceRoot":"","sources":["../../../../src/constants/chain-configs/subgraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,CAAC,MAAM,YAAY,GAAqC;IAC5D,CAAC,SAAS,CAAC,YAAY,CAAC,EACtB,wFAAwF;IAC1F,CAAC,SAAS,CAAC,IAAI,CAAC,EACd,
|
|
1
|
+
{"version":3,"file":"subgraph.js","sourceRoot":"","sources":["../../../../src/constants/chain-configs/subgraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,CAAC,MAAM,YAAY,GAAqC;IAC5D,CAAC,SAAS,CAAC,YAAY,CAAC,EACtB,wFAAwF;IAC1F,CAAC,SAAS,CAAC,IAAI,CAAC,EACd,wGAAwG;IAC1G,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAC1B,4FAA4F;IAC9F,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,yDAAyD;CAC7E,CAAC;AAEF,MAAM,OAAO,QAAQ;IACZ,MAAM,CAAC,KAAK,CAAC,GAAG,CACrB,OAAkB,EAClB,aAAqB,EACrB,KAAa,EACb,SAAa;QAEb,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,YAAY,CAAC,OAAO,CAAC,EACrB,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,EACnC;YACE,OAAO,EAAE,MAAM,EAAE,yBAAyB;SAC3C,CACF,CAAC;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAE,QAAQ,CAAC,IAAY,CAAC,MAAM,IAAI,sBAAsB,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { formatUnits, getAddress, isAddressEqual } from 'viem';
|
|
2
|
+
import { Subgraph } from '../../../constants/chain-configs/subgraph';
|
|
3
|
+
import { getMarketId } from '../../market/utils/market-id';
|
|
4
|
+
const toCurrency = (currencyDto) => ({
|
|
5
|
+
address: getAddress(currencyDto.id),
|
|
6
|
+
name: currencyDto.name,
|
|
7
|
+
symbol: currencyDto.symbol,
|
|
8
|
+
decimals: Number(currencyDto.decimals),
|
|
9
|
+
});
|
|
10
|
+
const toTrade = (chainId, tradeDto) => {
|
|
11
|
+
const inputCurrency = toCurrency(tradeDto.inputToken);
|
|
12
|
+
const outputCurrency = toCurrency(tradeDto.outputToken);
|
|
13
|
+
const quote = toCurrency(tradeDto.book.quote);
|
|
14
|
+
const base = toCurrency(tradeDto.book.base);
|
|
15
|
+
// Determine the market's quote token
|
|
16
|
+
const { quoteTokenAddress } = getMarketId(chainId, [
|
|
17
|
+
base.address,
|
|
18
|
+
quote.address,
|
|
19
|
+
]);
|
|
20
|
+
// Determine if this is a buy or sell from the trader's perspective
|
|
21
|
+
// Buy: trader spends quote (USDC), receives base (token)
|
|
22
|
+
// Sell: trader spends base (token), receives quote (USDC)
|
|
23
|
+
const isBuy = isAddressEqual(inputCurrency.address, quoteTokenAddress);
|
|
24
|
+
return {
|
|
25
|
+
id: tradeDto.id,
|
|
26
|
+
type: isBuy ? 'buy' : 'sell',
|
|
27
|
+
usdAmount: tradeDto.amountUSD,
|
|
28
|
+
spent: {
|
|
29
|
+
currency: inputCurrency,
|
|
30
|
+
amount: formatUnits(BigInt(tradeDto.inputAmount), inputCurrency.decimals),
|
|
31
|
+
direction: 'out',
|
|
32
|
+
},
|
|
33
|
+
taken: {
|
|
34
|
+
currency: outputCurrency,
|
|
35
|
+
amount: formatUnits(BigInt(tradeDto.outputAmount), outputCurrency.decimals),
|
|
36
|
+
direction: 'in',
|
|
37
|
+
},
|
|
38
|
+
timestamp: Number(tradeDto.timestamp),
|
|
39
|
+
txHash: tradeDto.transaction.id,
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Fetch trade history for a user from the subgraph
|
|
44
|
+
* @param chainId - chain id from {@link CHAIN_IDS}
|
|
45
|
+
* @param userAddress - The Ethereum address of the user
|
|
46
|
+
* @param options - Optional parameters for filtering and pagination
|
|
47
|
+
* @returns Trade history with pagination info
|
|
48
|
+
*/
|
|
49
|
+
export async function fetchTradeHistoryFromSubgraph(chainId, userAddress, options) {
|
|
50
|
+
const limit = options?.limit || 50;
|
|
51
|
+
const cursor = options?.cursor;
|
|
52
|
+
// Build the where clause
|
|
53
|
+
let whereClause;
|
|
54
|
+
const baseFilters = [`{trader: "${userAddress.toLowerCase()}"}`];
|
|
55
|
+
if (cursor) {
|
|
56
|
+
baseFilters.push(`{timestamp_lt: "${cursor}"}`);
|
|
57
|
+
}
|
|
58
|
+
// Build token filter if provided
|
|
59
|
+
if (options?.tokenAddresses && options.tokenAddresses.length > 0) {
|
|
60
|
+
const lowercaseTokens = options.tokenAddresses.map((addr) => addr.toLowerCase());
|
|
61
|
+
const tokenFilterConditions = lowercaseTokens
|
|
62
|
+
.map((addr) => `{inputToken: "${addr}"}, {outputToken: "${addr}"}`)
|
|
63
|
+
.join(', ');
|
|
64
|
+
// Combine base filters with token filter using 'and'
|
|
65
|
+
baseFilters.push(`{or: [${tokenFilterConditions}]}`);
|
|
66
|
+
whereClause = `{and: [${baseFilters.join(', ')}]}`;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// If no token filter, combine base filters with 'and' if multiple, or use single filter
|
|
70
|
+
if (baseFilters.length > 1) {
|
|
71
|
+
whereClause = `{and: [${baseFilters.join(', ')}]}`;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
whereClause = baseFilters[0];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Query both takes and makerFills
|
|
78
|
+
// Note: We need to fetch more than limit to properly sort and paginate
|
|
79
|
+
const fetchLimit = limit + 1; // Fetch one extra to determine hasNextPage
|
|
80
|
+
const query = `
|
|
81
|
+
query getTradeHistory {
|
|
82
|
+
takes(
|
|
83
|
+
where: ${whereClause}
|
|
84
|
+
orderBy: timestamp
|
|
85
|
+
orderDirection: desc
|
|
86
|
+
first: ${fetchLimit}
|
|
87
|
+
) {
|
|
88
|
+
id
|
|
89
|
+
timestamp
|
|
90
|
+
transaction { id }
|
|
91
|
+
book {
|
|
92
|
+
id
|
|
93
|
+
quote { id name symbol decimals }
|
|
94
|
+
base { id name symbol decimals }
|
|
95
|
+
}
|
|
96
|
+
inputToken { id name symbol decimals }
|
|
97
|
+
outputToken { id name symbol decimals }
|
|
98
|
+
inputAmount
|
|
99
|
+
outputAmount
|
|
100
|
+
amountUSD
|
|
101
|
+
type
|
|
102
|
+
}
|
|
103
|
+
makerFills(
|
|
104
|
+
where: ${whereClause}
|
|
105
|
+
orderBy: timestamp
|
|
106
|
+
orderDirection: desc
|
|
107
|
+
first: ${fetchLimit}
|
|
108
|
+
) {
|
|
109
|
+
id
|
|
110
|
+
timestamp
|
|
111
|
+
transaction { id }
|
|
112
|
+
book {
|
|
113
|
+
id
|
|
114
|
+
quote { id name symbol decimals }
|
|
115
|
+
base { id name symbol decimals }
|
|
116
|
+
}
|
|
117
|
+
inputToken { id name symbol decimals }
|
|
118
|
+
outputToken { id name symbol decimals }
|
|
119
|
+
inputAmount
|
|
120
|
+
outputAmount
|
|
121
|
+
amountUSD
|
|
122
|
+
type
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
`;
|
|
126
|
+
const { data: { takes, makerFills }, } = await Subgraph.get(chainId, 'getTradeHistory', query, {});
|
|
127
|
+
// Combine and sort all trades by timestamp (most recent first)
|
|
128
|
+
const allTrades = [...takes, ...makerFills].sort((a, b) => Number(b.timestamp) - Number(a.timestamp));
|
|
129
|
+
// Apply pagination
|
|
130
|
+
const hasNextPage = allTrades.length > limit;
|
|
131
|
+
const trades = allTrades.slice(0, limit);
|
|
132
|
+
const endCursor = trades.length > 0 ? trades[trades.length - 1].timestamp : null;
|
|
133
|
+
return {
|
|
134
|
+
trades: trades.map((trade) => toTrade(chainId, trade)),
|
|
135
|
+
pageInfo: {
|
|
136
|
+
hasNextPage,
|
|
137
|
+
endCursor,
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/entities/trade/apis/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/entities/trade/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAiC7D,MAAM,CAAN,IAAY,mBAaX;AAbD,WAAY,mBAAmB;IAC7B,uCAAgB,CAAA;IAChB,0CAAmB,CAAA;IACnB,yCAAkB,CAAA;IAClB,yCAAkB,CAAA;IAClB,6CAAsB,CAAA;IACtB,4CAAqB,CAAA;IACrB,qCAAc,CAAA;IACd,sCAAe,CAAA;IACf,uCAAgB,CAAA;IAChB,sCAAe,CAAA;IACf,oCAAa,CAAA;IACb,qCAAc,CAAA;AAChB,CAAC,EAbW,mBAAmB,KAAnB,mBAAmB,QAa9B"}
|
package/dist/esm/views/index.js
CHANGED
|
@@ -10,4 +10,6 @@ export { getTradingBalance, getPortfolioBalance, getAllBalances, } from './balan
|
|
|
10
10
|
export { checkTokenAllowances, needsVaultDeposit, getOrderSetupStatus, } from './setup';
|
|
11
11
|
export { getBookPositionValue } from './book';
|
|
12
12
|
export { getOrderPositionValue } from './order';
|
|
13
|
+
export { getTradeHistory } from './trade-history';
|
|
14
|
+
export { getUserVolumeUSD } from './user-volume';
|
|
13
15
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/views/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,4BAA4B,EAC5B,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/views/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,4BAA4B,EAC5B,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { fetchTradeHistoryFromSubgraph } from '../entities/trade/apis';
|
|
2
|
+
/**
|
|
3
|
+
* Retrieves trade history for the specified user on the given chain.
|
|
4
|
+
*
|
|
5
|
+
* @param {CHAIN_IDS} chainId The chain ID.
|
|
6
|
+
* @param {`0x${string}`} userAddress The Ethereum address of the user.
|
|
7
|
+
* @param {`0x${string}`[]} tokenAddresses Optional. Filter trades where any of these addresses is either input or output token. If empty array or undefined, no filtering is applied.
|
|
8
|
+
* @param {number} limit Optional. Maximum number of trades to return per page (default: 50).
|
|
9
|
+
* @param {string} cursor Optional. Pagination cursor (timestamp) to fetch trades older than this cursor.
|
|
10
|
+
* @returns {Promise<TradeHistoryResult>} Promise resolving to trade history with pagination metadata.
|
|
11
|
+
* @example
|
|
12
|
+
* import { getTradeHistory } from '@1stdex/first-sdk'
|
|
13
|
+
*
|
|
14
|
+
* const history = await getTradeHistory({
|
|
15
|
+
* chainId: 421614,
|
|
16
|
+
* userAddress: '0x5F79EE8f8fA862E98201120d83c4eC39D9468D49'
|
|
17
|
+
* })
|
|
18
|
+
*
|
|
19
|
+
* // Fetch next page
|
|
20
|
+
* const nextPage = await getTradeHistory({
|
|
21
|
+
* chainId: 421614,
|
|
22
|
+
* userAddress: '0x5F79EE8f8fA862E98201120d83c4eC39D9468D49',
|
|
23
|
+
* cursor: history.pageInfo.endCursor
|
|
24
|
+
* })
|
|
25
|
+
*
|
|
26
|
+
* // Filter by tokens
|
|
27
|
+
* const usdcTrades = await getTradeHistory({
|
|
28
|
+
* chainId: 421614,
|
|
29
|
+
* userAddress: '0x5F79EE8f8fA862E98201120d83c4eC39D9468D49',
|
|
30
|
+
* tokenAddresses: ['0x036CbD53842c5426634e7929541eC2318f3dCF7e']
|
|
31
|
+
* })
|
|
32
|
+
*/
|
|
33
|
+
export const getTradeHistory = async ({ chainId, userAddress, tokenAddresses, limit, cursor, }) => {
|
|
34
|
+
return fetchTradeHistoryFromSubgraph(chainId, userAddress, {
|
|
35
|
+
tokenAddresses: tokenAddresses || [],
|
|
36
|
+
limit,
|
|
37
|
+
cursor,
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=trade-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trade-history.js","sourceRoot":"","sources":["../../../src/views/trade-history.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,EACpC,OAAO,EACP,WAAW,EACX,cAAc,EACd,KAAK,EACL,MAAM,GAOP,EAA+B,EAAE;IAChC,OAAO,6BAA6B,CAAC,OAAO,EAAE,WAAW,EAAE;QACzD,cAAc,EAAE,cAAc,IAAI,EAAE;QACpC,KAAK;QACL,MAAM;KACP,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Subgraph } from '../constants/chain-configs/subgraph';
|
|
2
|
+
/**
|
|
3
|
+
* Retrieves the total volume in USD for a given user address.
|
|
4
|
+
*
|
|
5
|
+
* @param {CHAIN_IDS} chainId The chain ID.
|
|
6
|
+
* @param {`0x${string}`} userAddress The Ethereum address of the user.
|
|
7
|
+
* @returns {Promise<string>} Promise resolving to the user's total volume in USD.
|
|
8
|
+
* @example
|
|
9
|
+
* import { getUserVolumeUSD } from '@1stdex/first-sdk'
|
|
10
|
+
*
|
|
11
|
+
* const volumeUSD = await getUserVolumeUSD({
|
|
12
|
+
* chainId: 421614,
|
|
13
|
+
* userAddress: '0x5F79EE8f8fA862E98201120d83c4eC39D9468D49'
|
|
14
|
+
* })
|
|
15
|
+
* console.log(`User volume: $${volumeUSD}`)
|
|
16
|
+
*/
|
|
17
|
+
export const getUserVolumeUSD = async ({ chainId, userAddress, }) => {
|
|
18
|
+
const { data: { user }, } = await Subgraph.get(chainId, 'getUserVolume', 'query getUserVolume($userId: ID!) { user(id: $userId) { id volumeUSD nativeVolume firstSeenTimestamp firstSeenBlockNumber } }', {
|
|
19
|
+
userId: userAddress.toLowerCase(),
|
|
20
|
+
});
|
|
21
|
+
if (!user) {
|
|
22
|
+
return '0';
|
|
23
|
+
}
|
|
24
|
+
return user.volumeUSD;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=user-volume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-volume.js","sourceRoot":"","sources":["../../../src/views/user-volume.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAU/D;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,EACrC,OAAO,EACP,WAAW,GAIZ,EAAmB,EAAE;IACpB,MAAM,EACJ,IAAI,EAAE,EAAE,IAAI,EAAE,GACf,GAAG,MAAM,QAAQ,CAAC,GAAG,CAGpB,OAAO,EACP,eAAe,EACf,+HAA+H,EAC/H;QACE,MAAM,EAAE,WAAW,CAAC,WAAW,EAAE;KAClC,CACF,CAAC;IAEF,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC;AACxB,CAAC,CAAC"}
|