@zoralabs/protocol-sdk 0.9.1 → 0.9.2
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 +6 -0
- package/dist/anvil.d.ts.map +1 -1
- package/dist/apis/http-api-base.d.ts +1 -1
- package/dist/apis/http-api-base.d.ts.map +1 -1
- package/dist/apis/subgraph-querier.d.ts +6 -0
- package/dist/apis/subgraph-querier.d.ts.map +1 -1
- package/dist/create/1155-create-helper.d.ts +4 -1
- package/dist/create/1155-create-helper.d.ts.map +1 -1
- package/dist/create/contract-getter.d.ts +30 -0
- package/dist/create/contract-getter.d.ts.map +1 -0
- package/dist/create/contract-setup.d.ts +4 -8
- package/dist/create/contract-setup.d.ts.map +1 -1
- package/dist/create/mint-from-create.d.ts +3 -3
- package/dist/create/mint-from-create.d.ts.map +1 -1
- package/dist/create/subgraph-queries.d.ts +13 -0
- package/dist/create/subgraph-queries.d.ts.map +1 -0
- package/dist/index.cjs +176 -97
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +155 -76
- package/dist/index.js.map +1 -1
- package/dist/mint/subgraph-mint-getter.d.ts +2 -2
- package/dist/mint/subgraph-mint-getter.d.ts.map +1 -1
- package/dist/mint/subgraph-queries.d.ts +1 -5
- package/dist/mint/subgraph-queries.d.ts.map +1 -1
- package/dist/retries.d.ts +7 -0
- package/dist/retries.d.ts.map +1 -0
- package/dist/sdk.d.ts +2 -0
- package/dist/sdk.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/apis/http-api-base.ts +12 -20
- package/src/apis/subgraph-querier.ts +7 -0
- package/src/create/1155-create-helper.test.ts +22 -1
- package/src/create/1155-create-helper.ts +18 -9
- package/src/create/contract-getter.ts +90 -0
- package/src/create/contract-setup.ts +17 -46
- package/src/create/mint-from-create.ts +7 -15
- package/src/create/subgraph-queries.ts +35 -0
- package/src/mint/subgraph-mint-getter.ts +5 -2
- package/src/mint/subgraph-queries.ts +1 -7
- package/src/retries.ts +49 -0
- package/src/sdk.ts +8 -0
- package/test-integration/create-multiple-tokens-on-contract.ts +104 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Address } from "viem";
|
|
2
|
-
import { ISubgraphQuerier } from "../apis/subgraph-querier";
|
|
2
|
+
import { ISubgraphQuerier, ISubgraphQuery } from "../apis/subgraph-querier";
|
|
3
3
|
import { NetworkConfig } from "src/apis/chain-constants";
|
|
4
4
|
import { IOnchainMintGetter, SaleType, OnchainSalesConfigAndTokenInfo } from "./types";
|
|
5
|
-
import {
|
|
5
|
+
import { TokenQueryResult } from "./subgraph-queries";
|
|
6
6
|
export declare const getApiNetworkConfigForChain: (chainId: number) => NetworkConfig;
|
|
7
7
|
export declare class SubgraphMintGetter implements IOnchainMintGetter {
|
|
8
8
|
readonly subgraphQuerier: ISubgraphQuerier;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subgraph-mint-getter.d.ts","sourceRoot":"","sources":["../../src/mint/subgraph-mint-getter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,
|
|
1
|
+
{"version":3,"file":"subgraph-mint-getter.d.ts","sourceRoot":"","sources":["../../src/mint/subgraph-mint-getter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EACL,gBAAgB,EAChB,cAAc,EAEf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAwB,MAAM,0BAA0B,CAAC;AAE/E,OAAO,EACL,kBAAkB,EAClB,QAAQ,EAER,8BAA8B,EAE/B,MAAM,SAAS,CAAC;AACjB,OAAO,EAKL,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,2BAA2B,YAAa,MAAM,KAAG,aAK7D,CAAC;AA6HF,qBAAa,kBAAmB,YAAW,kBAAkB;IAC3D,SAAgB,eAAe,EAAE,gBAAgB,CAAC;IAClD,aAAa,EAAE,aAAa,CAAC;gBAEjB,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,gBAAgB;IAMzD,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC;IAIzD,wBAAwB,CAAC,CAAC,EAAE,EAChC,KAAK,EACL,SAAS,EACT,iBAAiB,GAClB,EAAE,cAAc,CAAC,CAAC,CAAC;IAUpB,WAAW,EAAE,kBAAkB,CAAC,aAAa,CAAC,CA0B5C;IAEI,mBAAmB,CAAC,EACxB,YAAY,EACZ,iBAAiB,EACjB,SAAS,GACV,EAAE;QACD,YAAY,EAAE,OAAO,CAAC;QACtB,iBAAiB,CAAC,EAAE,QAAQ,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC;KACnB;IAwBK,0BAA0B,CAAC,EAC/B,YAAY,GACb,EAAE;QACD,YAAY,EAAE,OAAO,CAAC;KACvB;;;;CAcF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ISubgraphQuery } from "src/apis/subgraph-querier";
|
|
1
2
|
import { GenericTokenIdTypes } from "src/types";
|
|
2
3
|
import { Address } from "viem";
|
|
3
4
|
export type FixedPriceSaleStrategyResult = {
|
|
@@ -69,11 +70,6 @@ export declare function buildNftTokenSalesQuery({ tokenId, tokenAddress, }: {
|
|
|
69
70
|
export declare function buildContractTokensQuery({ tokenAddress, }: {
|
|
70
71
|
tokenAddress: Address;
|
|
71
72
|
}): ISubgraphQuery<TokenQueryResult[]>;
|
|
72
|
-
export type ISubgraphQuery<T> = {
|
|
73
|
-
query: string;
|
|
74
|
-
variables: Record<string, any>;
|
|
75
|
-
parseResponseData: (data: any | undefined) => T | undefined;
|
|
76
|
-
};
|
|
77
73
|
export declare function buildPremintsOfContractQuery({ tokenAddress, }: {
|
|
78
74
|
tokenAddress: Address;
|
|
79
75
|
}): ISubgraphQuery<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subgraph-queries.d.ts","sourceRoot":"","sources":["../../src/mint/subgraph-queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,EAAE;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,IAAI,EAAE,YAAY,CAAC;IACnB,eAAe,EAAE;QACf,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE;YACN,EAAE,EAAE,OAAO,CAAC;YACZ,IAAI,EAAE,OAAO,CAAC;SACf,CAAC;QACF,kBAAkB,EAAE,OAAO,CAAC;KAC7B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B,4BAA4B,GAC5B,uBAAuB,GACvB,0BAA0B,GAC1B,iCAAiC,CAAC;AAEtC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC,aAAa,EAAE,SAAS,GAAG,QAAQ,CAAC;IACpC,QAAQ,EAAE;QACR,kBAAkB,EAAE,MAAM,CAAC;QAC3B,eAAe,EAAE,mBAAmB,EAAE,CAAC;QACvC,OAAO,EAAE,OAAO,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH,CAAC;AAmEF,wBAAgB,uBAAuB,CAAC,EACtC,OAAO,EACP,YAAY,GACb,EAAE;IACD,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,YAAY,EAAE,OAAO,CAAC;CACvB,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAoBnC;AAED,wBAAgB,wBAAwB,CAAC,EACvC,YAAY,GACb,EAAE;IACD,YAAY,EAAE,OAAO,CAAC;CACvB,GAAG,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAkBrC;
|
|
1
|
+
{"version":3,"file":"subgraph-queries.d.ts","sourceRoot":"","sources":["../../src/mint/subgraph-queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retries.d.ts","sourceRoot":"","sources":["../src/retries.ts"],"names":[],"mappings":"AAsCA,eAAO,MAAM,cAAc,GAAU,CAAC,UAAU;IAC9C,KAAK,EAAE,MAAM,CAAC,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;CAC5C,eAKA,CAAC"}
|
package/dist/sdk.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { MintClient } from "./mint/mint-client";
|
|
|
4
4
|
import { ClientConfig } from "./utils";
|
|
5
5
|
import { IPremintAPI } from "./premint/premint-api-client";
|
|
6
6
|
import { IOnchainMintGetter } from "./mint/types";
|
|
7
|
+
import { IContractGetter } from "./create/contract-getter";
|
|
7
8
|
export type CreatorClient = {
|
|
8
9
|
createPremint: PremintClient["createPremint"];
|
|
9
10
|
updatePremint: PremintClient["updatePremint"];
|
|
@@ -22,6 +23,7 @@ export type CollectorClient = {
|
|
|
22
23
|
export type CreatorClientConfig = ClientConfig & {
|
|
23
24
|
/** API for submitting and getting premints. Defaults to the Zora Premint API */
|
|
24
25
|
premintApi?: IPremintAPI;
|
|
26
|
+
contractGetter?: IContractGetter;
|
|
25
27
|
};
|
|
26
28
|
/**
|
|
27
29
|
* Builds the sdk for creating/managing 1155 contracts and tokens
|
package/dist/sdk.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAEd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,WAAW,EAAoB,MAAM,8BAA8B,CAAC;AAE7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAEd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,WAAW,EAAoB,MAAM,8BAA8B,CAAC;AAE7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EACL,eAAe,EAEhB,MAAM,0BAA0B,CAAC;AAElC,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAC9C,aAAa,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAC9C,aAAa,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAC9C,UAAU,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAC9C,4BAA4B,EAAE,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;CACnF,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IACxC,gCAAgC,EAAE,aAAa,CAAC,2BAA2B,CAAC,CAAC;IAC7E,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IACzB,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;IACzC,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC5B,mBAAmB,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG;IAC/C,iFAAiF;IACjF,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,cAAc,CAAC,EAAE,eAAe,CAAC;CAClC,CAAC;AAEF;;;;;KAKK;AACL,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,mBAAmB,GAChC,aAAa,CAwBf;AAED,MAAM,MAAM,qBAAqB,GAAG,YAAY,GAAG;IACjD,kEAAkE;IAClE,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,qBAAqB,GAC5B,eAAe,CAwBjB"}
|
package/package.json
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { retriesGeneric } from "src/retries";
|
|
2
|
+
|
|
1
3
|
export class BadResponseError<T = any> extends Error {
|
|
2
4
|
status: number;
|
|
3
5
|
json: T;
|
|
@@ -9,12 +11,6 @@ export class BadResponseError<T = any> extends Error {
|
|
|
9
11
|
}
|
|
10
12
|
}
|
|
11
13
|
|
|
12
|
-
async function wait(delayMs: number) {
|
|
13
|
-
return new Promise((resolve) => {
|
|
14
|
-
setTimeout(resolve, delayMs);
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
|
|
18
14
|
/**
|
|
19
15
|
* A simple fetch() wrapper for HTTP gets.
|
|
20
16
|
* Can be overridden as needed.
|
|
@@ -86,22 +82,18 @@ export const post = async <T>(url: string, data: any) => {
|
|
|
86
82
|
export const retries = async <T>(
|
|
87
83
|
tryFn: () => T,
|
|
88
84
|
maxTries: number = 3,
|
|
89
|
-
atTry: number = 1,
|
|
90
85
|
linearBackoffMS: number = 200,
|
|
91
86
|
): Promise<T> => {
|
|
92
|
-
|
|
93
|
-
return
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
throw err;
|
|
104
|
-
}
|
|
87
|
+
const shouldRetry = (err: any) => {
|
|
88
|
+
return err instanceof BadResponseError && err.status >= 500;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
return retriesGeneric({
|
|
92
|
+
tryFn,
|
|
93
|
+
maxTries,
|
|
94
|
+
linearBackoffMS,
|
|
95
|
+
shouldRetryOnError: shouldRetry,
|
|
96
|
+
});
|
|
105
97
|
};
|
|
106
98
|
|
|
107
99
|
export interface IHttpClient {
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { IHttpClient } from "./http-api-base";
|
|
2
2
|
|
|
3
|
+
export type ISubgraphQuery<T> = {
|
|
4
|
+
query: string;
|
|
5
|
+
variables: Record<string, any>;
|
|
6
|
+
parseResponseData: (data: any | undefined) => T | undefined;
|
|
7
|
+
};
|
|
8
|
+
|
|
3
9
|
export interface ISubgraphQuerier {
|
|
4
10
|
query: (params: {
|
|
5
11
|
subgraphUrl: string;
|
|
6
12
|
query: string;
|
|
7
13
|
variables?: Record<string, any>;
|
|
14
|
+
maxRetries?: number;
|
|
8
15
|
}) => Promise<object | undefined>;
|
|
9
16
|
}
|
|
10
17
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { describe, expect } from "vitest";
|
|
1
|
+
import { describe, expect, vi } from "vitest";
|
|
2
2
|
import {
|
|
3
3
|
getContractAddressFromReceipt,
|
|
4
4
|
getTokenIdFromCreateReceipt,
|
|
@@ -16,6 +16,8 @@ import { zora } from "viem/chains";
|
|
|
16
16
|
import { AllowList } from "src/allow-list/types";
|
|
17
17
|
import { createAllowList } from "src/allow-list/allow-list-client";
|
|
18
18
|
import { NewContractParams } from "./types";
|
|
19
|
+
import { SubgraphContractGetter } from "./contract-getter";
|
|
20
|
+
import { inspect } from "util";
|
|
19
21
|
|
|
20
22
|
export const demoTokenMetadataURI =
|
|
21
23
|
"ipfs://bafkreice23maski3x52tsfqgxstx3kbiifnt5jotg3a5ynvve53c4soi2u";
|
|
@@ -54,6 +56,7 @@ function logFailure(receipt: TransactionReceipt) {
|
|
|
54
56
|
if (receipt.status !== "success") {
|
|
55
57
|
console.log("transaction failed");
|
|
56
58
|
console.log(receipt.logs);
|
|
59
|
+
console.log(inspect(receipt, { depth: 10 }));
|
|
57
60
|
}
|
|
58
61
|
}
|
|
59
62
|
|
|
@@ -168,9 +171,12 @@ describe("create-helper", () => {
|
|
|
168
171
|
const addresses = await walletClient.getAddresses();
|
|
169
172
|
const creatorAccount = addresses[0]!;
|
|
170
173
|
|
|
174
|
+
const contractGetter = new SubgraphContractGetter(chain.id);
|
|
175
|
+
|
|
171
176
|
const creatorClient = createCreatorClient({
|
|
172
177
|
chainId: chain.id,
|
|
173
178
|
publicClient: publicClient,
|
|
179
|
+
contractGetter,
|
|
174
180
|
});
|
|
175
181
|
|
|
176
182
|
const { parameters: request, contractAddress: contractAddress } =
|
|
@@ -202,6 +208,21 @@ describe("create-helper", () => {
|
|
|
202
208
|
}),
|
|
203
209
|
).toBe(3n);
|
|
204
210
|
|
|
211
|
+
const contractVersion = await publicClient.readContract({
|
|
212
|
+
abi: zoraCreator1155ImplABI,
|
|
213
|
+
address: contractAddress,
|
|
214
|
+
functionName: "contractVersion",
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
contractGetter.getContractInfo = vi
|
|
218
|
+
.fn<SubgraphContractGetter["getContractInfo"]>()
|
|
219
|
+
.mockResolvedValueOnce({
|
|
220
|
+
contractVersion,
|
|
221
|
+
mintFee: parseEther("0.000777"),
|
|
222
|
+
name: "test",
|
|
223
|
+
nextTokenId: 2n,
|
|
224
|
+
});
|
|
225
|
+
|
|
205
226
|
const newTokenOnExistingContract =
|
|
206
227
|
await creatorClient.create1155OnExistingContract({
|
|
207
228
|
contractAddress: contractAddress,
|
|
@@ -13,8 +13,8 @@ import type {
|
|
|
13
13
|
import { decodeEventLog } from "viem";
|
|
14
14
|
import { makeContractParameters } from "src/utils";
|
|
15
15
|
import {
|
|
16
|
-
getContractInfoExistingContract,
|
|
17
16
|
getDeterministicContractAddress,
|
|
17
|
+
getNewContractMintFee,
|
|
18
18
|
new1155ContractVersion,
|
|
19
19
|
} from "./contract-setup";
|
|
20
20
|
import {
|
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
} from "./types";
|
|
28
28
|
import { constructCreate1155TokenCalls } from "./token-setup";
|
|
29
29
|
import { makeOnchainPrepareMintFromCreate } from "./mint-from-create";
|
|
30
|
+
import { IContractGetter } from "./contract-getter";
|
|
30
31
|
|
|
31
32
|
// Default royalty bps
|
|
32
33
|
const ROYALTY_BPS_DEFAULT = 1000;
|
|
@@ -136,16 +137,20 @@ function makeCreateTokenCall({
|
|
|
136
137
|
export class Create1155Client {
|
|
137
138
|
private readonly chainId: number;
|
|
138
139
|
private readonly publicClient: Pick<PublicClient, "readContract">;
|
|
140
|
+
public readonly contractGetter: IContractGetter;
|
|
139
141
|
|
|
140
142
|
constructor({
|
|
141
143
|
chainId,
|
|
142
144
|
publicClient,
|
|
145
|
+
contractGetter,
|
|
143
146
|
}: {
|
|
144
147
|
chainId: number;
|
|
145
148
|
publicClient: Pick<PublicClient, "readContract">;
|
|
149
|
+
contractGetter: IContractGetter;
|
|
146
150
|
}) {
|
|
147
151
|
this.chainId = chainId;
|
|
148
152
|
this.publicClient = publicClient;
|
|
153
|
+
this.contractGetter = contractGetter;
|
|
149
154
|
}
|
|
150
155
|
|
|
151
156
|
async createNew1155(
|
|
@@ -171,6 +176,7 @@ export class Create1155Client {
|
|
|
171
176
|
getAdditionalSetupActions,
|
|
172
177
|
publicClient: this.publicClient,
|
|
173
178
|
chainId: this.chainId,
|
|
179
|
+
contractGetter: this.contractGetter,
|
|
174
180
|
});
|
|
175
181
|
}
|
|
176
182
|
}
|
|
@@ -223,9 +229,14 @@ async function createNew1155ContractAndToken({
|
|
|
223
229
|
contractAddress: contractAddress,
|
|
224
230
|
contractVersion,
|
|
225
231
|
minter,
|
|
226
|
-
publicClient,
|
|
227
232
|
result: newToken.salesConfig,
|
|
228
233
|
tokenId: nextTokenId,
|
|
234
|
+
// to get the contract wide mint fee, we get what it would be for a new contract
|
|
235
|
+
getContractMintFee: async () =>
|
|
236
|
+
getNewContractMintFee({
|
|
237
|
+
publicClient,
|
|
238
|
+
chainId,
|
|
239
|
+
}),
|
|
229
240
|
});
|
|
230
241
|
|
|
231
242
|
return {
|
|
@@ -245,17 +256,15 @@ async function createNew1155Token({
|
|
|
245
256
|
account,
|
|
246
257
|
getAdditionalSetupActions,
|
|
247
258
|
token,
|
|
248
|
-
publicClient,
|
|
249
259
|
chainId,
|
|
260
|
+
contractGetter,
|
|
250
261
|
}: CreateNew1155TokenParams & {
|
|
251
262
|
publicClient: Pick<PublicClient, "readContract">;
|
|
252
263
|
chainId: number;
|
|
264
|
+
contractGetter: IContractGetter;
|
|
253
265
|
}): Promise<CreateNew1155TokenReturn> {
|
|
254
|
-
const { nextTokenId, contractVersion } =
|
|
255
|
-
await
|
|
256
|
-
publicClient,
|
|
257
|
-
contractAddress: contractAddress,
|
|
258
|
-
});
|
|
266
|
+
const { nextTokenId, contractVersion, mintFee } =
|
|
267
|
+
await contractGetter.getContractInfo({ contractAddress, retries: 5 });
|
|
259
268
|
|
|
260
269
|
const {
|
|
261
270
|
minter,
|
|
@@ -280,9 +289,9 @@ async function createNew1155Token({
|
|
|
280
289
|
contractAddress: contractAddress,
|
|
281
290
|
contractVersion,
|
|
282
291
|
minter,
|
|
283
|
-
publicClient,
|
|
284
292
|
result: newToken.salesConfig,
|
|
285
293
|
tokenId: nextTokenId,
|
|
294
|
+
getContractMintFee: async () => mintFee,
|
|
286
295
|
});
|
|
287
296
|
|
|
288
297
|
return {
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { NetworkConfig } from "src/apis/chain-constants";
|
|
2
|
+
import {
|
|
3
|
+
ISubgraphQuerier,
|
|
4
|
+
ISubgraphQuery,
|
|
5
|
+
SubgraphQuerier,
|
|
6
|
+
} from "src/apis/subgraph-querier";
|
|
7
|
+
import { httpClient as defaultHttpClient } from "../apis/http-api-base";
|
|
8
|
+
import { Address } from "viem";
|
|
9
|
+
import { getApiNetworkConfigForChain } from "src/mint/subgraph-mint-getter";
|
|
10
|
+
import { buildContractInfoQuery } from "./subgraph-queries";
|
|
11
|
+
import { retriesGeneric } from "src/retries";
|
|
12
|
+
|
|
13
|
+
export interface IContractGetter {
|
|
14
|
+
getContractInfo: (params: {
|
|
15
|
+
contractAddress: Address;
|
|
16
|
+
retries?: number;
|
|
17
|
+
}) => Promise<{
|
|
18
|
+
name: string;
|
|
19
|
+
contractVersion: string;
|
|
20
|
+
nextTokenId: bigint;
|
|
21
|
+
mintFee: bigint;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export class SubgraphContractGetter implements IContractGetter {
|
|
26
|
+
public readonly subgraphQuerier: ISubgraphQuerier;
|
|
27
|
+
networkConfig: NetworkConfig;
|
|
28
|
+
|
|
29
|
+
constructor(chainId: number, subgraphQuerier?: ISubgraphQuerier) {
|
|
30
|
+
this.subgraphQuerier =
|
|
31
|
+
subgraphQuerier || new SubgraphQuerier(defaultHttpClient);
|
|
32
|
+
this.networkConfig = getApiNetworkConfigForChain(chainId);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async querySubgraphWithRetries<T>({
|
|
36
|
+
query,
|
|
37
|
+
variables,
|
|
38
|
+
parseResponseData,
|
|
39
|
+
}: ISubgraphQuery<T>) {
|
|
40
|
+
const responseData = await this.subgraphQuerier.query({
|
|
41
|
+
subgraphUrl: this.networkConfig.subgraphUrl,
|
|
42
|
+
query,
|
|
43
|
+
variables,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
return parseResponseData(responseData);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async getContractInfo({
|
|
50
|
+
contractAddress,
|
|
51
|
+
retries = 1,
|
|
52
|
+
}: {
|
|
53
|
+
contractAddress: Address;
|
|
54
|
+
retries?: number;
|
|
55
|
+
}): Promise<{
|
|
56
|
+
name: string;
|
|
57
|
+
contractVersion: string;
|
|
58
|
+
nextTokenId: bigint;
|
|
59
|
+
mintFee: bigint;
|
|
60
|
+
}> {
|
|
61
|
+
const tryFn = async () => {
|
|
62
|
+
const responseData = await this.querySubgraphWithRetries(
|
|
63
|
+
buildContractInfoQuery({ contractAddress }),
|
|
64
|
+
);
|
|
65
|
+
if (!responseData) {
|
|
66
|
+
console.log("could not find contract");
|
|
67
|
+
throw new Error("Cannot find contract");
|
|
68
|
+
}
|
|
69
|
+
return responseData;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const responseData = await retriesGeneric({
|
|
73
|
+
tryFn,
|
|
74
|
+
maxTries: retries,
|
|
75
|
+
linearBackoffMS: 1000,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const nextTokenId =
|
|
79
|
+
responseData.tokens.length === 0
|
|
80
|
+
? 1n
|
|
81
|
+
: BigInt(responseData.tokens[0]!.tokenId) + 1n;
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
name: responseData.name,
|
|
85
|
+
contractVersion: responseData.contractVersion,
|
|
86
|
+
mintFee: BigInt(responseData.mintFeePerQuantity),
|
|
87
|
+
nextTokenId,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -18,52 +18,6 @@ export function new1155ContractVersion(chainId: number): string {
|
|
|
18
18
|
return address.CONTRACT_1155_IMPL_VERSION;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
export async function getContractInfoExistingContract({
|
|
22
|
-
publicClient,
|
|
23
|
-
contractAddress,
|
|
24
|
-
}: {
|
|
25
|
-
publicClient: Pick<PublicClient, "readContract">;
|
|
26
|
-
contractAddress: Address;
|
|
27
|
-
// Account that is the creator of the contract
|
|
28
|
-
}): Promise<{
|
|
29
|
-
contractVersion: string;
|
|
30
|
-
contractName: string;
|
|
31
|
-
nextTokenId: bigint;
|
|
32
|
-
}> {
|
|
33
|
-
// Check if contract exists either from metadata or the static address passed in.
|
|
34
|
-
// If a static address is passed in, this fails if that contract does not exist.
|
|
35
|
-
let contractVersion: string;
|
|
36
|
-
try {
|
|
37
|
-
contractVersion = await publicClient.readContract({
|
|
38
|
-
abi: zoraCreator1155ImplABI,
|
|
39
|
-
address: contractAddress,
|
|
40
|
-
functionName: "contractVersion",
|
|
41
|
-
});
|
|
42
|
-
} catch (e: any) {
|
|
43
|
-
// This logic branch is hit if the contract doesn't exist
|
|
44
|
-
// falling back to contractExists to false.
|
|
45
|
-
throw new Error(`Contract does not exist at ${contractAddress}`);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const nextTokenId = await publicClient.readContract({
|
|
49
|
-
address: contractAddress,
|
|
50
|
-
abi: zoraCreator1155ImplABI,
|
|
51
|
-
functionName: "nextTokenId",
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
const contractName = await publicClient.readContract({
|
|
55
|
-
address: contractAddress,
|
|
56
|
-
abi: zoraCreator1155ImplABI,
|
|
57
|
-
functionName: "name",
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
return {
|
|
61
|
-
contractVersion,
|
|
62
|
-
contractName,
|
|
63
|
-
nextTokenId,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
|
|
67
21
|
export async function getDeterministicContractAddress({
|
|
68
22
|
publicClient,
|
|
69
23
|
account,
|
|
@@ -96,3 +50,20 @@ export async function getDeterministicContractAddress({
|
|
|
96
50
|
|
|
97
51
|
return contractAddress;
|
|
98
52
|
}
|
|
53
|
+
|
|
54
|
+
export async function getNewContractMintFee({
|
|
55
|
+
publicClient,
|
|
56
|
+
chainId,
|
|
57
|
+
}: {
|
|
58
|
+
publicClient: Pick<PublicClient, "readContract">;
|
|
59
|
+
chainId: number;
|
|
60
|
+
}) {
|
|
61
|
+
const implAddress = contracts1155.addresses[chainId as contracts1155Address]
|
|
62
|
+
.CONTRACT_1155_IMPL as Address;
|
|
63
|
+
|
|
64
|
+
return await publicClient.readContract({
|
|
65
|
+
abi: zoraCreator1155ImplABI,
|
|
66
|
+
address: implAddress,
|
|
67
|
+
functionName: "mintFee",
|
|
68
|
+
});
|
|
69
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Address, parseEther,
|
|
1
|
+
import { Address, parseEther, zeroAddress } from "viem";
|
|
2
2
|
import { ConcreteSalesConfig } from "./types";
|
|
3
3
|
import {
|
|
4
4
|
AsyncPrepareMint,
|
|
@@ -6,7 +6,6 @@ import {
|
|
|
6
6
|
OnchainSalesStrategies,
|
|
7
7
|
PrepareMintReturn,
|
|
8
8
|
} from "src/mint/types";
|
|
9
|
-
import { zoraCreator1155ImplABI } from "@zoralabs/protocol-deployments";
|
|
10
9
|
import {
|
|
11
10
|
makePrepareMint1155TokenParams,
|
|
12
11
|
parseMintCosts,
|
|
@@ -16,13 +15,11 @@ import { getRequiredErc20Approvals } from "src/mint/mint-queries";
|
|
|
16
15
|
async function toSalesStrategyFromSubgraph({
|
|
17
16
|
minter,
|
|
18
17
|
salesConfig,
|
|
19
|
-
|
|
20
|
-
contractAddress,
|
|
18
|
+
getContractMintFee,
|
|
21
19
|
}: {
|
|
22
20
|
minter: Address;
|
|
23
21
|
salesConfig: ConcreteSalesConfig;
|
|
24
|
-
|
|
25
|
-
contractAddress: Address;
|
|
22
|
+
getContractMintFee: () => Promise<bigint>;
|
|
26
23
|
}): Promise<OnchainSalesStrategies> {
|
|
27
24
|
if (salesConfig.type === "timed") {
|
|
28
25
|
return {
|
|
@@ -51,11 +48,7 @@ async function toSalesStrategyFromSubgraph({
|
|
|
51
48
|
maxTokensPerAddress: salesConfig.maxTokensPerAddress,
|
|
52
49
|
};
|
|
53
50
|
}
|
|
54
|
-
const contractMintFee = await
|
|
55
|
-
abi: zoraCreator1155ImplABI,
|
|
56
|
-
address: contractAddress,
|
|
57
|
-
functionName: "mintFee",
|
|
58
|
-
});
|
|
51
|
+
const contractMintFee = await getContractMintFee();
|
|
59
52
|
if (salesConfig.type === "fixedPrice") {
|
|
60
53
|
return {
|
|
61
54
|
saleType: "fixedPrice",
|
|
@@ -81,21 +74,20 @@ export function makeOnchainPrepareMintFromCreate({
|
|
|
81
74
|
tokenId,
|
|
82
75
|
result,
|
|
83
76
|
minter,
|
|
84
|
-
|
|
77
|
+
getContractMintFee,
|
|
85
78
|
contractVersion,
|
|
86
79
|
}: {
|
|
87
80
|
contractAddress: Address;
|
|
88
81
|
tokenId: bigint;
|
|
89
82
|
result: ConcreteSalesConfig;
|
|
90
83
|
minter: Address;
|
|
91
|
-
|
|
84
|
+
getContractMintFee: () => Promise<bigint>;
|
|
92
85
|
contractVersion: string;
|
|
93
86
|
}): AsyncPrepareMint {
|
|
94
87
|
return async (params: MintParametersBase): Promise<PrepareMintReturn> => {
|
|
95
88
|
const subgraphSalesConfig = await toSalesStrategyFromSubgraph({
|
|
96
89
|
minter,
|
|
97
|
-
|
|
98
|
-
publicClient,
|
|
90
|
+
getContractMintFee,
|
|
99
91
|
salesConfig: result,
|
|
100
92
|
});
|
|
101
93
|
return {
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ISubgraphQuery } from "src/apis/subgraph-querier";
|
|
2
|
+
import { Address } from "viem";
|
|
3
|
+
|
|
4
|
+
export function buildContractInfoQuery({
|
|
5
|
+
contractAddress,
|
|
6
|
+
}: {
|
|
7
|
+
contractAddress: Address;
|
|
8
|
+
}): ISubgraphQuery<{
|
|
9
|
+
name: string;
|
|
10
|
+
contractVersion: string;
|
|
11
|
+
mintFeePerQuantity: string;
|
|
12
|
+
tokens: {
|
|
13
|
+
tokenId: Address;
|
|
14
|
+
}[];
|
|
15
|
+
}> {
|
|
16
|
+
return {
|
|
17
|
+
query: `
|
|
18
|
+
query ($contractAddress: Bytes!) {
|
|
19
|
+
zoraCreateContract(id: $contractAddress) {
|
|
20
|
+
contractVersion
|
|
21
|
+
name
|
|
22
|
+
mintFeePerQuantity
|
|
23
|
+
tokens(first: 1, orderBy: tokenId, orderDirection: desc) {
|
|
24
|
+
tokenId
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
`,
|
|
29
|
+
variables: {
|
|
30
|
+
contractAddress: contractAddress.toLowerCase(),
|
|
31
|
+
},
|
|
32
|
+
parseResponseData: (responseData: any | undefined) =>
|
|
33
|
+
responseData.zoraCreateContract,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { Address } from "viem";
|
|
2
2
|
import { httpClient as defaultHttpClient } from "../apis/http-api-base";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
ISubgraphQuerier,
|
|
5
|
+
ISubgraphQuery,
|
|
6
|
+
SubgraphQuerier,
|
|
7
|
+
} from "../apis/subgraph-querier";
|
|
4
8
|
import { NetworkConfig, networkConfigByChain } from "src/apis/chain-constants";
|
|
5
9
|
import { GenericTokenIdTypes } from "src/types";
|
|
6
10
|
import {
|
|
@@ -14,7 +18,6 @@ import {
|
|
|
14
18
|
buildContractTokensQuery,
|
|
15
19
|
buildNftTokenSalesQuery,
|
|
16
20
|
buildPremintsOfContractQuery,
|
|
17
|
-
ISubgraphQuery,
|
|
18
21
|
SalesStrategyResult,
|
|
19
22
|
TokenQueryResult,
|
|
20
23
|
} from "./subgraph-queries";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ISubgraphQuery } from "src/apis/subgraph-querier";
|
|
1
2
|
import { GenericTokenIdTypes } from "src/types";
|
|
2
3
|
import { Address } from "viem";
|
|
3
4
|
|
|
@@ -189,13 +190,6 @@ query ($contract: Bytes!) {
|
|
|
189
190
|
responseData?.zoraCreateTokens,
|
|
190
191
|
};
|
|
191
192
|
}
|
|
192
|
-
|
|
193
|
-
export type ISubgraphQuery<T> = {
|
|
194
|
-
query: string;
|
|
195
|
-
variables: Record<string, any>;
|
|
196
|
-
parseResponseData: (data: any | undefined) => T | undefined;
|
|
197
|
-
};
|
|
198
|
-
|
|
199
193
|
export function buildPremintsOfContractQuery({
|
|
200
194
|
tokenAddress,
|
|
201
195
|
}: {
|
package/src/retries.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
async function wait(delayMs: number) {
|
|
2
|
+
return new Promise((resolve) => {
|
|
3
|
+
setTimeout(resolve, delayMs);
|
|
4
|
+
});
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const retryInternal = async <T>({
|
|
8
|
+
tryFn,
|
|
9
|
+
maxTries = 3,
|
|
10
|
+
atTry,
|
|
11
|
+
linearBackoffMS = 200,
|
|
12
|
+
shouldRetryOnError = () => true,
|
|
13
|
+
}: {
|
|
14
|
+
tryFn: () => T;
|
|
15
|
+
maxTries?: number;
|
|
16
|
+
atTry: number;
|
|
17
|
+
linearBackoffMS?: number;
|
|
18
|
+
shouldRetryOnError?: (err: any) => boolean;
|
|
19
|
+
}): Promise<T> => {
|
|
20
|
+
try {
|
|
21
|
+
return await tryFn();
|
|
22
|
+
} catch (err: any) {
|
|
23
|
+
if (shouldRetryOnError(err)) {
|
|
24
|
+
if (atTry <= maxTries) {
|
|
25
|
+
await wait(atTry * linearBackoffMS);
|
|
26
|
+
return await retryInternal({
|
|
27
|
+
tryFn,
|
|
28
|
+
maxTries,
|
|
29
|
+
atTry: atTry + 1,
|
|
30
|
+
linearBackoffMS,
|
|
31
|
+
shouldRetryOnError,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
throw err;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const retriesGeneric = async <T>(params: {
|
|
40
|
+
tryFn: () => T;
|
|
41
|
+
maxTries?: number;
|
|
42
|
+
linearBackoffMS?: number;
|
|
43
|
+
shouldRetryOnError?: (err: any) => boolean;
|
|
44
|
+
}) => {
|
|
45
|
+
return retryInternal({
|
|
46
|
+
...params,
|
|
47
|
+
atTry: 1,
|
|
48
|
+
});
|
|
49
|
+
};
|