@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.
- package/.turbo/turbo-build.log +7 -7
- package/CHANGELOG.md +17 -0
- package/dist/apis/network-config.d.ts +3 -0
- package/dist/apis/network-config.d.ts.map +1 -0
- package/dist/create/contract-setup.d.ts +3 -4
- package/dist/create/contract-setup.d.ts.map +1 -1
- package/dist/create/create-client.d.ts +53 -0
- package/dist/create/create-client.d.ts.map +1 -0
- package/dist/create/types.d.ts +11 -3
- package/dist/create/types.d.ts.map +1 -1
- package/dist/fixtures/contract-setup.d.ts +2 -2
- package/dist/fixtures/contract-setup.d.ts.map +1 -1
- package/dist/fixtures/rewards-query-results.d.ts +0 -1
- package/dist/fixtures/rewards-query-results.d.ts.map +1 -1
- package/dist/fixtures/secondary.d.ts +3 -6
- package/dist/fixtures/secondary.d.ts.map +1 -1
- package/dist/index.cjs +1509 -1396
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +12 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1559 -1465
- package/dist/index.js.map +1 -1
- package/dist/mint/mint-client.d.ts +21 -9
- package/dist/mint/mint-client.d.ts.map +1 -1
- package/dist/mint/mint-queries.d.ts +24 -22
- package/dist/mint/mint-queries.d.ts.map +1 -1
- package/dist/mint/strategies-parsing.d.ts +28 -0
- package/dist/mint/strategies-parsing.d.ts.map +1 -0
- package/dist/mint/subgraph-mint-getter.d.ts +2 -6
- package/dist/mint/subgraph-mint-getter.d.ts.map +1 -1
- package/dist/mint/types.d.ts +25 -8
- package/dist/mint/types.d.ts.map +1 -1
- package/dist/premint/premint-api-client.d.ts.map +1 -1
- package/dist/premint/premint-client.d.ts.map +1 -1
- package/dist/rewards/rewards-client.d.ts +7 -3
- package/dist/rewards/rewards-client.d.ts.map +1 -1
- package/dist/rewards/rewards-queries.d.ts +14 -11
- package/dist/rewards/rewards-queries.d.ts.map +1 -1
- package/dist/rewards/subgraph-queries.d.ts +0 -1
- package/dist/rewards/subgraph-queries.d.ts.map +1 -1
- package/dist/rewards/subgraph-rewards-getter.d.ts +2 -8
- package/dist/rewards/subgraph-rewards-getter.d.ts.map +1 -1
- package/dist/sdk.d.ts +9 -3
- package/dist/sdk.d.ts.map +1 -1
- package/dist/secondary/secondary-client.d.ts +7 -8
- package/dist/secondary/secondary-client.d.ts.map +1 -1
- package/dist/secondary/uniswap/uniswapQuote.d.ts +0 -1
- package/dist/secondary/uniswap/uniswapQuote.d.ts.map +1 -1
- package/dist/secondary/utils.d.ts +1 -2
- package/dist/secondary/utils.d.ts.map +1 -1
- package/dist/types.d.ts +6 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +2 -2
- package/dist/utils.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/apis/network-config.ts +8 -0
- package/src/apis/subgraph-getter.ts +1 -1
- package/src/comments/comments.test.ts +11 -22
- package/src/create/contract-setup.ts +3 -4
- package/src/create/{1155-create-helper.test.ts → create-client.test.ts} +52 -88
- package/src/create/{1155-create-helper.ts → create-client.ts} +129 -63
- package/src/create/types.ts +13 -3
- package/src/fixtures/contract-setup.ts +3 -3
- package/src/fixtures/rewards-query-results.ts +2 -9
- package/src/fixtures/secondary.ts +16 -10
- package/src/index.ts +34 -4
- package/src/mint/mint-client.test.ts +37 -64
- package/src/mint/mint-client.ts +36 -32
- package/src/mint/mint-queries.ts +73 -54
- package/src/mint/strategies-parsing.ts +311 -0
- package/src/mint/subgraph-mint-getter.ts +4 -304
- package/src/mint/types.ts +36 -7
- package/src/premint/premint-api-client.ts +1 -1
- package/src/premint/premint-client.ts +1 -1
- package/src/rewards/rewards-client.test.ts +318 -21
- package/src/rewards/rewards-client.ts +15 -16
- package/src/rewards/rewards-queries.ts +116 -36
- package/src/rewards/subgraph-queries.ts +0 -2
- package/src/rewards/subgraph-rewards-getter.ts +3 -13
- package/src/sdk.ts +9 -7
- package/src/secondary/secondary-client.test.ts +39 -40
- package/src/secondary/secondary-client.ts +14 -33
- package/src/secondary/uniswap/uniswapQuote.ts +3 -2
- package/src/secondary/utils.ts +2 -2
- package/src/types.ts +15 -4
- package/src/utils.ts +9 -3
- package/dist/create/1155-create-helper.d.ts +0 -29
- 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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
}
|