Skip to content

Commit b16078b

Browse files
authored
Premint SDK - update to support additionalAdmins and executing premints against non-premint contracts (ourzora#433)
Updates the protocol sdk to: * support creating/minting premints by just specifying a collection address * support creating/minting premints with additional admins
1 parent c5cb404 commit b16078b

File tree

12 files changed

+377
-176
lines changed

12 files changed

+377
-176
lines changed

.changeset/dirty-pants-shave.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@zoralabs/protocol-sdk": patch
3+
---
4+
5+
premintClient now supports creating/minting premints with additional admins and ones that were created with just a collection address

packages/protocol-deployments/src/types.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,25 @@ import {
44
zoraCreator1155PremintExecutorImplABI,
55
iPremintDefinitionsABI,
66
} from "./generated/wagmi";
7+
import { Address } from "viem";
78

89
export enum PremintConfigVersion {
910
V1 = "1",
1011
V2 = "2",
1112
V3 = "3",
1213
}
1314

14-
export type ContractCreationConfig = AbiParametersToPrimitiveTypes<
15-
ExtractAbiFunction<
16-
typeof zoraCreator1155PremintExecutorImplABI,
17-
"premint"
18-
>["inputs"]
19-
>[0];
15+
export type ContractCreationConfig = Omit<
16+
AbiParametersToPrimitiveTypes<
17+
ExtractAbiFunction<
18+
typeof zoraCreator1155PremintExecutorImplABI,
19+
"premint"
20+
>["inputs"]
21+
>[0],
22+
"additionalAdmins"
23+
> & {
24+
additionalAdmins: Address[];
25+
};
2026

2127
export type TokenCreationConfigV1 = AbiParametersToPrimitiveTypes<
2228
ExtractAbiFunction<

packages/protocol-sdk/src/apis/generated/premint-api-types.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ export interface components {
7171
contractURI: string;
7272
/** Contractname */
7373
contractName: string;
74+
/**
75+
* Additionaladmins
76+
* @default []
77+
*/
78+
additionalAdmins?: string[];
7479
};
7580
/** HTTPValidationError */
7681
HTTPValidationError: {
@@ -187,14 +192,16 @@ export interface components {
187192
* ...: other: str = "default"
188193
*/
189194
PremintRequest: {
190-
collection: components["schemas"]["CollectionCreationConfig"];
195+
collection?: components["schemas"]["CollectionCreationConfig"];
191196
/** Premint */
192197
premint:
193198
| components["schemas"]["PremintConfigV1"]
194199
| components["schemas"]["PremintConfigV2"];
195200
chain_name: components["schemas"]["ChainName"];
196201
/** Signature */
197202
signature: string;
203+
/** Collection Address */
204+
collection_address?: string;
198205
};
199206
/**
200207
* PremintSignature
@@ -209,7 +216,7 @@ export interface components {
209216
* ...: other: str = "default"
210217
*/
211218
PremintSignature: {
212-
collection: components["schemas"]["CollectionCreationConfig"];
219+
collection?: components["schemas"]["CollectionCreationConfig"];
213220
/** Premint */
214221
premint:
215222
| components["schemas"]["PremintConfigV1"]

packages/protocol-sdk/src/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,9 @@ export * from "./mints/mints-queries";
1919
export * from "./mints/mints-contracts";
2020

2121
export * from "./mints/mints-eth-unwrapper-and-caller";
22+
23+
export {
24+
type ContractCreationConfigWithOptionalAdditionalAdmins,
25+
type ContractCreationConfigOrAddress,
26+
type ContractCreationConfigAndAddress,
27+
} from "./premint/contract-types";

packages/protocol-sdk/src/mints/mints-contracts.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import {
1818
Address,
1919
BaseError,
2020
ContractFunctionRevertedError,
21-
PublicClient,
2221
WalletClient,
2322
parseEther,
2423
} from "viem";
@@ -39,8 +38,9 @@ import {
3938
getFixedPricedMinter,
4039
waitForSuccess,
4140
} from "src/test-utils";
41+
import { PublicClient } from "src/utils";
4242

43-
const mintsMainnetDeployedBlock = 12990454;
43+
const mintsMainnetDeployedBlock = 15372992;
4444

4545
const anvilTest = makeAnvilTest({
4646
forkUrl: forkUrls.zoraMainnet,
Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,38 @@
1-
import { PremintConfigVersion as PremintConfigVersionOrig } from "@zoralabs/protocol-deployments";
1+
import {
2+
ContractCreationConfig,
3+
PremintConfigVersion as PremintConfigVersionOrig,
4+
} from "@zoralabs/protocol-deployments";
5+
import { Address } from "viem";
26

37
export enum PremintConfigVersion {
48
V1 = PremintConfigVersionOrig.V1,
59
V2 = PremintConfigVersionOrig.V2,
610
V3 = PremintConfigVersionOrig.V3,
711
}
12+
13+
export type ContractCreationConfigWithOptionalAdditionalAdmins = Omit<
14+
ContractCreationConfig,
15+
"additionalAdmins"
16+
> & {
17+
/** Optional: if there are additional admins accounts that should be added as contract wide admins upon contract creation. */
18+
additionalAdmins?: Address[];
19+
};
20+
21+
export type ContractCreationConfigAndAddress = {
22+
/** Parameters for creating the contract for new premints. */
23+
collection?: ContractCreationConfigWithOptionalAdditionalAdmins;
24+
/** Premint collection address */
25+
collectionAddress: Address;
26+
};
27+
28+
export type ContractCreationConfigOrAddress =
29+
| {
30+
/** Parameters for creating the contract for new premints. */
31+
collection: ContractCreationConfigWithOptionalAdditionalAdmins;
32+
collectionAddress?: undefined;
33+
}
34+
| {
35+
collection?: undefined;
36+
/** Premint collection address */
37+
collectionAddress: Address;
38+
};

packages/protocol-sdk/src/premint/conversions.ts

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,21 @@ import {
1010
PremintConfigWithVersion,
1111
} from "@zoralabs/protocol-deployments";
1212
import { PremintSignatureGetResponse } from "./premint-api-client";
13+
import { ContractCreationConfigOrAddress } from "./contract-types";
1314

1415
export const convertCollectionFromApi = (
1516
collection: PremintSignatureGetResponse["collection"],
16-
): ContractCreationConfig => ({
17-
...collection,
18-
contractAdmin: collection.contractAdmin as Address,
19-
additionalAdmins: [],
20-
});
17+
): ContractCreationConfig | undefined => {
18+
if (!collection) return undefined;
19+
20+
return {
21+
additionalAdmins:
22+
(collection.additionalAdmins as Address[] | undefined) || [],
23+
contractAdmin: collection.contractAdmin as Address,
24+
contractName: collection.contractName,
25+
contractURI: collection.contractURI,
26+
};
27+
};
2128

2229
/**
2330
* Convert server to on-chain types for a premint
@@ -82,6 +89,7 @@ export const convertGetPremintApiResponse = (
8289
) => ({
8390
...convertPremintFromApi(response.premint),
8491
collection: convertCollectionFromApi(response.collection),
92+
collectionAddress: response.collection_address as Address,
8593
signature: response.signature as Hex,
8694
});
8795

@@ -143,20 +151,24 @@ export type PremintSignatureResponse =
143151
*/
144152
export const encodePostSignatureInput = <T extends PremintConfigVersion>({
145153
collection,
154+
collectionAddress,
146155
premintConfigVersion,
147156
premintConfig,
148157
signature,
149158
chainId,
150159
}: {
151-
collection: ContractCreationConfig;
152160
signature: Hex;
153161
chainId: number;
154-
} & PremintConfigWithVersion<T>): PremintSignatureRequestBody => ({
162+
} & PremintConfigWithVersion<T> &
163+
ContractCreationConfigOrAddress): PremintSignatureRequestBody => ({
155164
premint: encodePremintForAPI({
156165
premintConfig,
157166
premintConfigVersion,
158167
}),
159168
signature,
160-
collection,
169+
collection: collection as
170+
| PremintSignatureRequestBody["collection"]
171+
| undefined,
172+
collection_address: collectionAddress,
161173
chain_name: networkConfigByChain[chainId]!.zoraBackendChainName,
162174
});

packages/protocol-sdk/src/premint/premint-api-client.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
convertGetPremintApiResponse,
2020
encodePostSignatureInput,
2121
} from "./conversions";
22+
import { ContractCreationConfigOrAddress } from "./contract-types";
2223

2324
type PremintNextUIDGetType =
2425
paths["/signature/{chain_name}/{collection_address}/next_uid"]["get"];
@@ -91,16 +92,14 @@ class PremintAPIClient {
9192
this.networkConfig = getApiNetworkConfigForChain(chainId);
9293
}
9394
postSignature = async <T extends PremintConfigVersion>({
94-
collection,
9595
signature,
96-
...premintConfigAndVersion
96+
...rest
9797
}: {
98-
collection: ContractCreationConfig;
9998
signature: Hex;
100-
} & PremintConfigWithVersion<T>): Promise<PremintSignatureResponse> => {
99+
} & PremintConfigWithVersion<T> &
100+
ContractCreationConfigOrAddress): Promise<PremintSignatureResponse> => {
101101
const data = encodePostSignatureInput({
102-
collection,
103-
...premintConfigAndVersion,
102+
...rest,
104103
chainId: this.networkConfig.chainId,
105104
signature,
106105
});
@@ -128,7 +127,8 @@ class PremintAPIClient {
128127
}): Promise<
129128
{
130129
signature: Hex;
131-
collection: ContractCreationConfig;
130+
collection: ContractCreationConfig | undefined;
131+
collectionAddress: Address;
132132
} & PremintConfigAndVersion
133133
> => {
134134
const response = await getSignature({

0 commit comments

Comments
 (0)