@zoralabs/protocol-sdk 0.11.11 → 0.12.0

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 (88) hide show
  1. package/.turbo/turbo-build.log +7 -7
  2. package/CHANGELOG.md +17 -0
  3. package/dist/apis/network-config.d.ts +3 -0
  4. package/dist/apis/network-config.d.ts.map +1 -0
  5. package/dist/create/contract-setup.d.ts +3 -4
  6. package/dist/create/contract-setup.d.ts.map +1 -1
  7. package/dist/create/create-client.d.ts +53 -0
  8. package/dist/create/create-client.d.ts.map +1 -0
  9. package/dist/create/types.d.ts +11 -3
  10. package/dist/create/types.d.ts.map +1 -1
  11. package/dist/fixtures/contract-setup.d.ts +2 -2
  12. package/dist/fixtures/contract-setup.d.ts.map +1 -1
  13. package/dist/fixtures/rewards-query-results.d.ts +0 -1
  14. package/dist/fixtures/rewards-query-results.d.ts.map +1 -1
  15. package/dist/fixtures/secondary.d.ts +3 -6
  16. package/dist/fixtures/secondary.d.ts.map +1 -1
  17. package/dist/index.cjs +1509 -1396
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.ts +12 -2
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +1559 -1465
  22. package/dist/index.js.map +1 -1
  23. package/dist/mint/mint-client.d.ts +21 -9
  24. package/dist/mint/mint-client.d.ts.map +1 -1
  25. package/dist/mint/mint-queries.d.ts +24 -22
  26. package/dist/mint/mint-queries.d.ts.map +1 -1
  27. package/dist/mint/strategies-parsing.d.ts +28 -0
  28. package/dist/mint/strategies-parsing.d.ts.map +1 -0
  29. package/dist/mint/subgraph-mint-getter.d.ts +2 -6
  30. package/dist/mint/subgraph-mint-getter.d.ts.map +1 -1
  31. package/dist/mint/types.d.ts +25 -8
  32. package/dist/mint/types.d.ts.map +1 -1
  33. package/dist/premint/premint-api-client.d.ts.map +1 -1
  34. package/dist/premint/premint-client.d.ts.map +1 -1
  35. package/dist/rewards/rewards-client.d.ts +7 -3
  36. package/dist/rewards/rewards-client.d.ts.map +1 -1
  37. package/dist/rewards/rewards-queries.d.ts +14 -11
  38. package/dist/rewards/rewards-queries.d.ts.map +1 -1
  39. package/dist/rewards/subgraph-queries.d.ts +0 -1
  40. package/dist/rewards/subgraph-queries.d.ts.map +1 -1
  41. package/dist/rewards/subgraph-rewards-getter.d.ts +2 -8
  42. package/dist/rewards/subgraph-rewards-getter.d.ts.map +1 -1
  43. package/dist/sdk.d.ts +9 -3
  44. package/dist/sdk.d.ts.map +1 -1
  45. package/dist/secondary/secondary-client.d.ts +7 -8
  46. package/dist/secondary/secondary-client.d.ts.map +1 -1
  47. package/dist/secondary/uniswap/uniswapQuote.d.ts +0 -1
  48. package/dist/secondary/uniswap/uniswapQuote.d.ts.map +1 -1
  49. package/dist/secondary/utils.d.ts +1 -2
  50. package/dist/secondary/utils.d.ts.map +1 -1
  51. package/dist/types.d.ts +6 -3
  52. package/dist/types.d.ts.map +1 -1
  53. package/dist/utils.d.ts +2 -2
  54. package/dist/utils.d.ts.map +1 -1
  55. package/package.json +2 -2
  56. package/src/apis/network-config.ts +8 -0
  57. package/src/apis/subgraph-getter.ts +1 -1
  58. package/src/comments/comments.test.ts +11 -22
  59. package/src/create/contract-setup.ts +3 -4
  60. package/src/create/{1155-create-helper.test.ts → create-client.test.ts} +52 -88
  61. package/src/create/{1155-create-helper.ts → create-client.ts} +129 -63
  62. package/src/create/types.ts +13 -3
  63. package/src/fixtures/contract-setup.ts +3 -3
  64. package/src/fixtures/rewards-query-results.ts +2 -9
  65. package/src/fixtures/secondary.ts +16 -10
  66. package/src/index.ts +34 -4
  67. package/src/mint/mint-client.test.ts +37 -64
  68. package/src/mint/mint-client.ts +36 -32
  69. package/src/mint/mint-queries.ts +73 -54
  70. package/src/mint/strategies-parsing.ts +311 -0
  71. package/src/mint/subgraph-mint-getter.ts +4 -304
  72. package/src/mint/types.ts +36 -7
  73. package/src/premint/premint-api-client.ts +1 -1
  74. package/src/premint/premint-client.ts +1 -1
  75. package/src/rewards/rewards-client.test.ts +318 -21
  76. package/src/rewards/rewards-client.ts +15 -16
  77. package/src/rewards/rewards-queries.ts +116 -36
  78. package/src/rewards/subgraph-queries.ts +0 -2
  79. package/src/rewards/subgraph-rewards-getter.ts +3 -13
  80. package/src/sdk.ts +9 -7
  81. package/src/secondary/secondary-client.test.ts +39 -40
  82. package/src/secondary/secondary-client.ts +14 -33
  83. package/src/secondary/uniswap/uniswapQuote.ts +3 -2
  84. package/src/secondary/utils.ts +2 -2
  85. package/src/types.ts +15 -4
  86. package/src/utils.ts +9 -3
  87. package/dist/create/1155-create-helper.d.ts +0 -29
  88. package/dist/create/1155-create-helper.d.ts.map +0 -1
@@ -0,0 +1,311 @@
1
+ import { GenericTokenIdTypes } from "src/types";
2
+ import {
3
+ SaleType,
4
+ OnchainMintable,
5
+ OnchainSalesStrategies,
6
+ GetMintableReturn,
7
+ ZoraTimedSaleStrategy,
8
+ } from "./types";
9
+ import {
10
+ ERC20SaleStrategyResult,
11
+ FixedPriceSaleStrategyResult,
12
+ PresaleSalesStrategyResult,
13
+ SalesStrategyResult,
14
+ TokenQueryResult,
15
+ ZoraTimedMinterSaleStrategyResult,
16
+ } from "./subgraph-queries";
17
+
18
+ type ParsedSalesConfig = {
19
+ salesStrategy: OnchainSalesStrategies;
20
+ // saleActive: boolean;
21
+ saleEnd: bigint | undefined;
22
+ saleStart: bigint;
23
+ };
24
+
25
+ function parseFixedPriceSalesConfig(
26
+ fixedPrice: FixedPriceSaleStrategyResult["fixedPrice"],
27
+ contractMintFee: bigint,
28
+ // blockTime: bigint,
29
+ ): ParsedSalesConfig {
30
+ // const saleEnd = BigInt(fixedPrice.saleEnd);
31
+ return {
32
+ salesStrategy: {
33
+ saleType: "fixedPrice",
34
+ ...fixedPrice,
35
+ maxTokensPerAddress: BigInt(fixedPrice.maxTokensPerAddress),
36
+ pricePerToken: BigInt(fixedPrice.pricePerToken),
37
+ mintFeePerQuantity: contractMintFee,
38
+ },
39
+ saleEnd: BigInt(fixedPrice.saleEnd),
40
+ saleStart: BigInt(fixedPrice.saleStart),
41
+ // saleActive:
42
+ // BigInt(fixedPrice.saleStart) <= blockTime && BigInt(saleEnd) > blockTime,
43
+ };
44
+ }
45
+
46
+ function parseERC20SalesConfig(
47
+ erc20Minter: ERC20SaleStrategyResult["erc20Minter"],
48
+ // blockTime: bigint,
49
+ ): ParsedSalesConfig {
50
+ // const saleEnd = BigInt(erc20Minter.saleEnd);
51
+ return {
52
+ salesStrategy: {
53
+ saleType: "erc20",
54
+ ...erc20Minter,
55
+ maxTokensPerAddress: BigInt(erc20Minter.maxTokensPerAddress),
56
+ pricePerToken: BigInt(erc20Minter.pricePerToken),
57
+ mintFeePerQuantity: 0n,
58
+ },
59
+ saleEnd: BigInt(erc20Minter.saleEnd),
60
+ saleStart: BigInt(erc20Minter.saleStart),
61
+ // saleActive:
62
+ // BigInt(erc20Minter.saleStart) <= blockTime && saleEnd > blockTime,
63
+ };
64
+ }
65
+
66
+ function parsePresaleSalesConfig(
67
+ presale: PresaleSalesStrategyResult["presale"],
68
+ contractMintFee: bigint,
69
+ // blockTime: bigint,
70
+ ): ParsedSalesConfig {
71
+ // const saleEnd = BigInt(presale.presaleEnd);
72
+ return {
73
+ salesStrategy: {
74
+ saleType: "allowlist",
75
+ address: presale.address,
76
+ merkleRoot: presale.merkleRoot,
77
+ saleStart: presale.presaleStart,
78
+ saleEnd: presale.presaleEnd,
79
+ mintFeePerQuantity: contractMintFee,
80
+ },
81
+ saleEnd: BigInt(presale.presaleEnd),
82
+ saleStart: BigInt(presale.presaleStart),
83
+ // saleActive:
84
+ // BigInt(presale.presaleStart) <= blockTime && saleEnd > blockTime,
85
+ };
86
+ }
87
+
88
+ function parseZoraTimedSalesConfig(
89
+ zoraTimedMinter: ZoraTimedMinterSaleStrategyResult["zoraTimedMinter"],
90
+ // blockTime: bigint,
91
+ ): ParsedSalesConfig {
92
+ const saleEnd = BigInt(zoraTimedMinter.saleEnd);
93
+ return {
94
+ salesStrategy: {
95
+ saleType: "timed",
96
+ address: zoraTimedMinter.address,
97
+ mintFee: BigInt(zoraTimedMinter.mintFee),
98
+ saleStart: zoraTimedMinter.saleStart,
99
+ saleEnd: zoraTimedMinter.saleEnd,
100
+ erc20Z: zoraTimedMinter.erc20Z.id,
101
+ pool: zoraTimedMinter.erc20Z.pool,
102
+ secondaryActivated: zoraTimedMinter.secondaryActivated,
103
+ mintFeePerQuantity: BigInt(zoraTimedMinter.mintFee),
104
+ marketCountdown: zoraTimedMinter.marketCountdown
105
+ ? BigInt(zoraTimedMinter.marketCountdown)
106
+ : undefined,
107
+ minimumMarketEth: zoraTimedMinter.minimumMarketEth
108
+ ? BigInt(zoraTimedMinter.minimumMarketEth)
109
+ : undefined,
110
+ },
111
+ saleEnd: saleEnd > 0n ? saleEnd : undefined,
112
+ saleStart: BigInt(zoraTimedMinter.saleStart),
113
+ // saleActive:
114
+ // BigInt(zoraTimedMinter.saleStart) <= blockTime &&
115
+ // (hasSaleEnd ? saleEnd > blockTime : true),
116
+ };
117
+ }
118
+
119
+ function parseSalesConfig(
120
+ targetStrategy: SalesStrategyResult,
121
+ contractMintFee: bigint,
122
+ ): ParsedSalesConfig {
123
+ switch (targetStrategy.type) {
124
+ case "FIXED_PRICE":
125
+ return parseFixedPriceSalesConfig(
126
+ targetStrategy.fixedPrice,
127
+ contractMintFee,
128
+ // blockTime,
129
+ );
130
+ case "ERC_20_MINTER":
131
+ return parseERC20SalesConfig(targetStrategy.erc20Minter);
132
+ case "PRESALE":
133
+ return parsePresaleSalesConfig(
134
+ targetStrategy.presale,
135
+ contractMintFee,
136
+ // blockTime,
137
+ );
138
+ case "ZORA_TIMED":
139
+ return parseZoraTimedSalesConfig(
140
+ targetStrategy.zoraTimedMinter,
141
+ // blockTime,
142
+ );
143
+ default:
144
+ throw new Error("Unknown saleType");
145
+ }
146
+ }
147
+
148
+ function isPrimaryMintActive(sale: ParsedSalesConfig, blockTime: bigint) {
149
+ if (sale.saleStart > blockTime) return false;
150
+ if (!sale.saleEnd) return true;
151
+
152
+ return sale.saleEnd > blockTime;
153
+ }
154
+
155
+ function isSecondaryMinter(
156
+ result: OnchainSalesStrategies,
157
+ ): result is ZoraTimedSaleStrategy {
158
+ return result.saleType === "timed";
159
+ }
160
+
161
+ function isSecondaryMarketActive(sale: ParsedSalesConfig) {
162
+ const salesStrategy = sale.salesStrategy;
163
+ if (isSecondaryMinter(salesStrategy)) {
164
+ return salesStrategy.secondaryActivated;
165
+ }
166
+ return false;
167
+ }
168
+
169
+ type WithPrimaryAndSecondaryMintActive = {
170
+ strategy: ParsedSalesConfig;
171
+ primaryMintActive: boolean;
172
+ secondaryMarketActive: boolean;
173
+ };
174
+
175
+ function getTargetStrategy({
176
+ preferredSaleType,
177
+ blockTime,
178
+ parsedStrategies,
179
+ }: {
180
+ preferredSaleType?: SaleType;
181
+ blockTime: bigint;
182
+ parsedStrategies: ParsedSalesConfig[];
183
+ }): WithPrimaryAndSecondaryMintActive | undefined {
184
+ const withPrimaryAndSecondaryMintActive = parsedStrategies.map(
185
+ (strategy) => ({
186
+ strategy,
187
+ primaryMintActive: isPrimaryMintActive(strategy, blockTime),
188
+ secondaryMarketActive: isSecondaryMarketActive(strategy),
189
+ }),
190
+ );
191
+ const stillValidSalesStrategies = withPrimaryAndSecondaryMintActive.filter(
192
+ ({ primaryMintActive, secondaryMarketActive }) =>
193
+ primaryMintActive || secondaryMarketActive,
194
+ );
195
+
196
+ const saleStrategies = stillValidSalesStrategies.sort((a, b) =>
197
+ (a.strategy.saleEnd ?? 0n) > (b.strategy.saleEnd ?? 0n) ? 1 : -1,
198
+ );
199
+
200
+ let targetStrategy: WithPrimaryAndSecondaryMintActive | undefined;
201
+
202
+ if (!preferredSaleType) {
203
+ return saleStrategies[0];
204
+ } else {
205
+ targetStrategy = saleStrategies.find(
206
+ ({ strategy: { salesStrategy } }) =>
207
+ salesStrategy.saleType === preferredSaleType,
208
+ );
209
+ if (!targetStrategy) {
210
+ targetStrategy = saleStrategies.find(
211
+ ({ strategy: { salesStrategy } }) =>
212
+ salesStrategy.saleType === "timed" ||
213
+ salesStrategy.saleType === "fixedPrice" ||
214
+ salesStrategy.saleType === "erc20",
215
+ );
216
+ if (!targetStrategy) throw new Error("Cannot find valid sale strategy");
217
+ return targetStrategy;
218
+ }
219
+ }
220
+
221
+ return targetStrategy;
222
+ }
223
+
224
+ export function findTargetStrategyWithPrimaryOrSecondarySaleActive({
225
+ token,
226
+ tokenId,
227
+ preferredSaleType,
228
+ defaultMintFee,
229
+ blockTime,
230
+ }: {
231
+ token: TokenQueryResult;
232
+ tokenId?: GenericTokenIdTypes;
233
+ preferredSaleType?: SaleType;
234
+ defaultMintFee: bigint;
235
+ blockTime: bigint;
236
+ }) {
237
+ const allStrategies =
238
+ (typeof tokenId !== "undefined"
239
+ ? token.salesStrategies
240
+ : token.contract.salesStrategies) || [];
241
+
242
+ const parsedStrategies = allStrategies.map((strategy) =>
243
+ parseSalesConfig(strategy, defaultMintFee),
244
+ );
245
+
246
+ const targetStrategy = getTargetStrategy({
247
+ preferredSaleType: preferredSaleType,
248
+ blockTime,
249
+ parsedStrategies,
250
+ });
251
+
252
+ return targetStrategy;
253
+ }
254
+
255
+ export function parseAndFilterTokenQueryResult({
256
+ token,
257
+ tokenId,
258
+ preferredSaleType,
259
+ blockTime,
260
+ }: {
261
+ token: TokenQueryResult;
262
+ tokenId?: GenericTokenIdTypes;
263
+ preferredSaleType?: SaleType;
264
+ blockTime: bigint;
265
+ }): GetMintableReturn {
266
+ const defaultMintFee = BigInt(token.contract.mintFeePerQuantity);
267
+ const salesStrategyAndMintInfo =
268
+ findTargetStrategyWithPrimaryOrSecondarySaleActive({
269
+ token,
270
+ tokenId,
271
+ preferredSaleType,
272
+ defaultMintFee,
273
+ blockTime,
274
+ });
275
+
276
+ const tokenInfo = parseTokenInfo({
277
+ token,
278
+ });
279
+
280
+ return {
281
+ salesConfigAndTokenInfo: {
282
+ ...tokenInfo,
283
+ salesConfig: salesStrategyAndMintInfo?.strategy.salesStrategy,
284
+ },
285
+ primaryMintActive: salesStrategyAndMintInfo?.primaryMintActive ?? false,
286
+ primaryMintEnd: salesStrategyAndMintInfo?.strategy.saleEnd,
287
+ secondaryMarketActive:
288
+ salesStrategyAndMintInfo?.secondaryMarketActive ?? false,
289
+ };
290
+ }
291
+
292
+ function parseTokenInfo({
293
+ token,
294
+ }: {
295
+ token: TokenQueryResult;
296
+ }): Omit<OnchainMintable, "primaryMintActive" | "primaryMintEnd"> {
297
+ return {
298
+ contract: {
299
+ address: token.contract.address,
300
+ name: token.contract.name,
301
+ URI: token.contract.contractURI,
302
+ },
303
+ tokenURI: token.uri,
304
+ tokenId: token.tokenId ? BigInt(token.tokenId) : undefined,
305
+ mintType: token.tokenStandard === "ERC721" ? "721" : "1155",
306
+ creator: token.creator,
307
+ totalMinted: BigInt(token.totalMinted),
308
+ maxSupply: BigInt(token.maxSupply),
309
+ contractVersion: token.contract.contractVersion,
310
+ };
311
+ }
@@ -1,214 +1,13 @@
1
1
  import { Address } from "viem";
2
2
  import { ISubgraphQuerier } from "../apis/subgraph-querier";
3
- import { NetworkConfig, networkConfigByChain } from "src/apis/chain-constants";
4
- import { GenericTokenIdTypes } from "src/types";
5
- import {
6
- IOnchainMintGetter,
7
- SaleType,
8
- OnchainMintable,
9
- OnchainSalesStrategies,
10
- GetMintableReturn,
11
- } from "./types";
3
+ import { IOnchainMintGetter, SaleType } from "./types";
12
4
  import {
13
5
  buildContractTokensQuery,
14
6
  buildNftTokenSalesQuery,
15
7
  buildPremintsOfContractQuery,
16
- ERC20SaleStrategyResult,
17
- FixedPriceSaleStrategyResult,
18
- PresaleSalesStrategyResult,
19
- SalesStrategyResult,
20
- TokenQueryResult,
21
- ZoraTimedMinterSaleStrategyResult,
22
8
  } from "./subgraph-queries";
23
9
  import { SubgraphGetter } from "src/apis/subgraph-getter";
24
-
25
- export const getApiNetworkConfigForChain = (chainId: number): NetworkConfig => {
26
- if (!networkConfigByChain[chainId]) {
27
- throw new Error(`chain id ${chainId} network not configured `);
28
- }
29
- return networkConfigByChain[chainId]!;
30
- };
31
- type ParsedSalesConfig = {
32
- salesStrategy: OnchainSalesStrategies;
33
- saleActive: boolean;
34
- saleEnd: bigint | undefined;
35
- secondaryMarketActive?: boolean;
36
- };
37
-
38
- function parseFixedPriceSalesConfig(
39
- fixedPrice: FixedPriceSaleStrategyResult["fixedPrice"],
40
- contractMintFee: bigint,
41
- blockTime: bigint,
42
- ): ParsedSalesConfig {
43
- const saleEnd = BigInt(fixedPrice.saleEnd);
44
- return {
45
- salesStrategy: {
46
- saleType: "fixedPrice",
47
- ...fixedPrice,
48
- maxTokensPerAddress: BigInt(fixedPrice.maxTokensPerAddress),
49
- pricePerToken: BigInt(fixedPrice.pricePerToken),
50
- mintFeePerQuantity: contractMintFee,
51
- },
52
- saleEnd,
53
- saleActive:
54
- BigInt(fixedPrice.saleStart) <= blockTime && BigInt(saleEnd) > blockTime,
55
- };
56
- }
57
-
58
- function parseERC20SalesConfig(
59
- erc20Minter: ERC20SaleStrategyResult["erc20Minter"],
60
- blockTime: bigint,
61
- ): ParsedSalesConfig {
62
- const saleEnd = BigInt(erc20Minter.saleEnd);
63
- return {
64
- salesStrategy: {
65
- saleType: "erc20",
66
- ...erc20Minter,
67
- maxTokensPerAddress: BigInt(erc20Minter.maxTokensPerAddress),
68
- pricePerToken: BigInt(erc20Minter.pricePerToken),
69
- mintFeePerQuantity: 0n,
70
- },
71
- saleEnd,
72
- saleActive:
73
- BigInt(erc20Minter.saleStart) <= blockTime && saleEnd > blockTime,
74
- };
75
- }
76
-
77
- function parsePresaleSalesConfig(
78
- presale: PresaleSalesStrategyResult["presale"],
79
- contractMintFee: bigint,
80
- blockTime: bigint,
81
- ): ParsedSalesConfig {
82
- const saleEnd = BigInt(presale.presaleEnd);
83
- return {
84
- salesStrategy: {
85
- saleType: "allowlist",
86
- address: presale.address,
87
- merkleRoot: presale.merkleRoot,
88
- saleStart: presale.presaleStart,
89
- saleEnd: presale.presaleEnd,
90
- mintFeePerQuantity: contractMintFee,
91
- },
92
- saleEnd,
93
- saleActive:
94
- BigInt(presale.presaleStart) <= blockTime && saleEnd > blockTime,
95
- };
96
- }
97
-
98
- function parseZoraTimedSalesConfig(
99
- zoraTimedMinter: ZoraTimedMinterSaleStrategyResult["zoraTimedMinter"],
100
- blockTime: bigint,
101
- ): ParsedSalesConfig {
102
- const saleEnd = BigInt(zoraTimedMinter.saleEnd);
103
- const hasSaleEnd = saleEnd > 0n;
104
- return {
105
- salesStrategy: {
106
- saleType: "timed",
107
- address: zoraTimedMinter.address,
108
- mintFee: BigInt(zoraTimedMinter.mintFee),
109
- saleStart: zoraTimedMinter.saleStart,
110
- saleEnd: zoraTimedMinter.saleEnd,
111
- erc20Z: zoraTimedMinter.erc20Z.id,
112
- pool: zoraTimedMinter.erc20Z.pool,
113
- secondaryActivated: zoraTimedMinter.secondaryActivated,
114
- mintFeePerQuantity: BigInt(zoraTimedMinter.mintFee),
115
- marketCountdown: zoraTimedMinter.marketCountdown
116
- ? BigInt(zoraTimedMinter.marketCountdown)
117
- : undefined,
118
- minimumMarketEth: zoraTimedMinter.minimumMarketEth
119
- ? BigInt(zoraTimedMinter.minimumMarketEth)
120
- : undefined,
121
- },
122
- saleEnd: hasSaleEnd ? saleEnd : undefined,
123
- secondaryMarketActive: zoraTimedMinter.secondaryActivated,
124
- saleActive:
125
- BigInt(zoraTimedMinter.saleStart) <= blockTime &&
126
- (hasSaleEnd ? saleEnd > blockTime : true),
127
- };
128
- }
129
-
130
- function parseSalesConfig(
131
- targetStrategy: SalesStrategyResult,
132
- contractMintFee: bigint,
133
- blockTime: bigint,
134
- ): ParsedSalesConfig {
135
- switch (targetStrategy.type) {
136
- case "FIXED_PRICE":
137
- return parseFixedPriceSalesConfig(
138
- targetStrategy.fixedPrice,
139
- contractMintFee,
140
- blockTime,
141
- );
142
- case "ERC_20_MINTER":
143
- return parseERC20SalesConfig(targetStrategy.erc20Minter, blockTime);
144
- case "PRESALE":
145
- return parsePresaleSalesConfig(
146
- targetStrategy.presale,
147
- contractMintFee,
148
- blockTime,
149
- );
150
- case "ZORA_TIMED":
151
- return parseZoraTimedSalesConfig(
152
- targetStrategy.zoraTimedMinter,
153
- blockTime,
154
- );
155
- default:
156
- throw new Error("Unknown saleType");
157
- }
158
- }
159
-
160
- function getTargetStrategy({
161
- tokenId,
162
- preferredSaleType,
163
- token,
164
- blockTime,
165
- contractMintFee,
166
- }: {
167
- tokenId?: GenericTokenIdTypes;
168
- preferredSaleType?: SaleType;
169
- token: TokenQueryResult;
170
- blockTime: bigint;
171
- contractMintFee: bigint;
172
- }): ParsedSalesConfig | undefined {
173
- const allStrategies =
174
- (typeof tokenId !== "undefined"
175
- ? token.salesStrategies
176
- : token.contract.salesStrategies) || [];
177
-
178
- const parsedStrategies = allStrategies.map((strategy) =>
179
- parseSalesConfig(strategy, contractMintFee, blockTime),
180
- );
181
-
182
- const stillValidSalesStrategies = parsedStrategies.filter(
183
- (strategy) => strategy.saleActive || strategy.secondaryMarketActive,
184
- );
185
-
186
- const saleStrategies = stillValidSalesStrategies.sort((a, b) =>
187
- (a.saleEnd ?? 0n) > (b.saleEnd ?? 0n) ? 1 : -1,
188
- );
189
-
190
- let targetStrategy: ParsedSalesConfig | undefined;
191
-
192
- if (!preferredSaleType) {
193
- return saleStrategies[0];
194
- } else {
195
- targetStrategy = saleStrategies.find(
196
- ({ salesStrategy }) => salesStrategy.saleType === preferredSaleType,
197
- );
198
- if (!targetStrategy) {
199
- const targetStrategy = saleStrategies.find(
200
- ({ salesStrategy }) =>
201
- salesStrategy.saleType === "timed" ||
202
- salesStrategy.saleType === "fixedPrice" ||
203
- salesStrategy.saleType === "erc20",
204
- );
205
- if (!targetStrategy) throw new Error("Cannot find valid sale strategy");
206
- return targetStrategy;
207
- }
208
- }
209
-
210
- return targetStrategy;
211
- }
10
+ import { parseAndFilterTokenQueryResult } from "./strategies-parsing";
212
11
 
213
12
  export class SubgraphMintGetter
214
13
  extends SubgraphGetter
@@ -218,15 +17,9 @@ export class SubgraphMintGetter
218
17
  super(chainId, subgraphQuerier);
219
18
  }
220
19
 
221
- async getContractMintFee(contract: TokenQueryResult["contract"]) {
222
- return BigInt(contract.mintFeePerQuantity);
223
- }
224
-
225
20
  getMintable: IOnchainMintGetter["getMintable"] = async ({
226
21
  tokenAddress,
227
22
  tokenId,
228
- preferredSaleType: saleType,
229
- blockTime,
230
23
  }) => {
231
24
  const token = await this.querySubgraphWithRetries(
232
25
  buildNftTokenSalesQuery({
@@ -239,15 +32,7 @@ export class SubgraphMintGetter
239
32
  throw new Error("Cannot find token");
240
33
  }
241
34
 
242
- const defaultMintFee = await this.getContractMintFee(token.contract);
243
-
244
- return parseTokenQueryResult({
245
- token: token,
246
- defaultMintFee,
247
- tokenId,
248
- preferredSaleType: saleType,
249
- blockTime,
250
- });
35
+ return token;
251
36
  };
252
37
 
253
38
  async getContractMintable({
@@ -267,16 +52,13 @@ export class SubgraphMintGetter
267
52
 
268
53
  if (!tokens || tokens.length === 0) return [];
269
54
 
270
- const defaultMintFee = await this.getContractMintFee(tokens[0]!.contract);
271
-
272
55
  return tokens
273
56
  .filter((x) => x.tokenId !== "0")
274
57
  .map((token) =>
275
- parseTokenQueryResult({
58
+ parseAndFilterTokenQueryResult({
276
59
  token,
277
60
  tokenId: token.tokenId,
278
61
  preferredSaleType,
279
- defaultMintFee,
280
62
  blockTime,
281
63
  }),
282
64
  );
@@ -301,85 +83,3 @@ export class SubgraphMintGetter
301
83
  );
302
84
  }
303
85
  }
304
-
305
- function getTargetStrategyAndMintFeeAndSaleActive({
306
- token,
307
- tokenId,
308
- preferredSaleType,
309
- defaultMintFee,
310
- blockTime,
311
- }: {
312
- token: TokenQueryResult;
313
- tokenId?: GenericTokenIdTypes;
314
- preferredSaleType?: SaleType;
315
- defaultMintFee: bigint;
316
- blockTime: bigint;
317
- }) {
318
- const targetStrategy = getTargetStrategy({
319
- tokenId,
320
- preferredSaleType: preferredSaleType,
321
- token,
322
- blockTime,
323
- contractMintFee: defaultMintFee,
324
- });
325
-
326
- return targetStrategy;
327
- }
328
-
329
- function parseTokenQueryResult({
330
- token,
331
- tokenId,
332
- preferredSaleType,
333
- defaultMintFee,
334
- blockTime,
335
- }: {
336
- token: TokenQueryResult;
337
- tokenId?: GenericTokenIdTypes;
338
- preferredSaleType?: SaleType;
339
- defaultMintFee: bigint;
340
- blockTime: bigint;
341
- }): GetMintableReturn {
342
- const salesStrategyAndMintInfo = getTargetStrategyAndMintFeeAndSaleActive({
343
- token,
344
- tokenId,
345
- preferredSaleType,
346
- defaultMintFee,
347
- blockTime,
348
- });
349
-
350
- const tokenInfo = parseTokenInfo({
351
- token,
352
- });
353
-
354
- return {
355
- salesConfigAndTokenInfo: {
356
- ...tokenInfo,
357
- salesConfig: salesStrategyAndMintInfo?.salesStrategy,
358
- },
359
- primaryMintActive: salesStrategyAndMintInfo?.saleActive ?? false,
360
- primaryMintEnd: salesStrategyAndMintInfo?.saleEnd,
361
- secondaryMarketActive:
362
- salesStrategyAndMintInfo?.secondaryMarketActive ?? false,
363
- };
364
- }
365
-
366
- function parseTokenInfo({
367
- token,
368
- }: {
369
- token: TokenQueryResult;
370
- }): Omit<OnchainMintable, "primaryMintActive" | "primaryMintEnd"> {
371
- return {
372
- contract: {
373
- address: token.contract.address,
374
- name: token.contract.name,
375
- URI: token.contract.contractURI,
376
- },
377
- tokenURI: token.uri,
378
- tokenId: token.tokenId ? BigInt(token.tokenId) : undefined,
379
- mintType: token.tokenStandard === "ERC721" ? "721" : "1155",
380
- creator: token.creator,
381
- totalMinted: BigInt(token.totalMinted),
382
- maxSupply: BigInt(token.maxSupply),
383
- contractVersion: token.contract.contractVersion,
384
- };
385
- }