@zoralabs/protocol-sdk 0.2.0 → 0.3.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/premint/premint-client.ts","../src/premint/preminter.ts","../src/apis/http-api-base.ts","../src/constants.ts","../src/premint/premint-api-client.ts","../src/apis/client-base.ts","../src/apis/chain-constants.ts","../src/mint/mint-api-client.ts","../src/create/1155-create-helper.ts"],"sourcesContent":["export * from \"./premint/premint-client\";\n\nexport * from \"./premint/preminter\";\n\nexport * from \"./premint/premint-api-client\";\n\nexport * from \"./mint/mint-api-client\";\n\nexport * from \"./create/1155-create-helper\";\n","import { decodeEventLog } from \"viem\";\nimport type {\n Account,\n Address,\n Chain,\n Hex,\n PublicClient,\n TransactionReceipt,\n WalletClient,\n} from \"viem\";\nimport {\n zoraCreator1155PremintExecutorImplABI,\n zoraCreator1155PremintExecutorImplAddress,\n zoraCreatorFixedPriceSaleStrategyAddress,\n} from \"@zoralabs/protocol-deployments\";\nimport { PremintConfig, preminterTypedDataDefinition } from \"./preminter\";\nimport type {\n PremintSignatureGetResponse,\n PremintSignatureResponse,\n} from \"./premint-api-client\";\nimport { PremintAPIClient } from \"./premint-api-client\";\nimport type { DecodeEventLogReturnType } from \"viem\";\nimport { ClientBase } from \"../apis/client-base\";\nimport { OPEN_EDITION_MINT_SIZE } from \"../constants\";\nimport { REWARD_PER_TOKEN } from \"src/apis/chain-constants\";\n\ntype MintArgumentsSettings = {\n tokenURI: string;\n maxSupply?: bigint;\n maxTokensPerAddress?: bigint;\n pricePerToken?: bigint;\n mintStart?: bigint;\n mintDuration?: bigint;\n royaltyMintSchedule?: number;\n royaltyBPS?: number;\n royaltyRecipient?: Address;\n fixedPriceMinter?: Address;\n};\n\ntype PremintedLogType = DecodeEventLogReturnType<\n typeof zoraCreator1155PremintExecutorImplABI,\n \"Preminted\"\n>[\"args\"];\n\ntype URLSReturnType = {\n explorer: null | string;\n zoraCollect: null | string;\n zoraManage: null | string;\n};\n\ntype SignedPremintResponse = {\n urls: URLSReturnType;\n uid: number;\n verifyingContract: Address;\n premint: PremintSignatureResponse;\n};\n\ntype ExecutedPremintResponse = {\n receipt: TransactionReceipt;\n premintedLog?: PremintedLogType;\n urls: URLSReturnType;\n};\n\nexport const DefaultMintArguments = {\n maxSupply: OPEN_EDITION_MINT_SIZE,\n maxTokensPerAddress: 0n,\n pricePerToken: 0n,\n mintDuration: BigInt(60 * 60 * 24 * 7), // 1 week\n mintStart: 0n,\n royaltyMintSchedule: 0,\n royaltyBPS: 1000, // 10%,\n};\n\n/**\n * Gets the preminted log from receipt\n *\n * @param receipt Preminted log from receipt\n * @returns Premint event arguments\n */\nexport function getPremintedLogFromReceipt(\n receipt: TransactionReceipt,\n): PremintedLogType | undefined {\n for (const data of receipt.logs) {\n try {\n const decodedLog = decodeEventLog({\n abi: zoraCreator1155PremintExecutorImplABI,\n eventName: \"Preminted\",\n ...data,\n });\n if (decodedLog.eventName === \"Preminted\") {\n return decodedLog.args;\n }\n } catch (err: any) {}\n }\n}\n\n/**\n * Convert server to on-chain types for a premint\n *\n * @param premint Premint object from the server to convert to one that's compatible with viem\n * @returns Viem type-compatible premint object\n */\nexport const convertPremint = (\n premint: PremintSignatureGetResponse[\"premint\"],\n) => ({\n ...premint,\n tokenConfig: {\n ...premint.tokenConfig,\n fixedPriceMinter: premint.tokenConfig.fixedPriceMinter as Address,\n royaltyRecipient: premint.tokenConfig.royaltyRecipient as Address,\n maxSupply: BigInt(premint.tokenConfig.maxSupply),\n pricePerToken: BigInt(premint.tokenConfig.pricePerToken),\n mintStart: BigInt(premint.tokenConfig.mintStart),\n mintDuration: BigInt(premint.tokenConfig.mintDuration),\n maxTokensPerAddress: BigInt(premint.tokenConfig.maxTokensPerAddress),\n },\n});\n\nexport const convertCollection = (\n collection: PremintSignatureGetResponse[\"collection\"],\n) => ({\n ...collection,\n contractAdmin: collection.contractAdmin as Address,\n});\n\n/**\n * Convert on-chain types for a premint to a server safe type\n *\n * @param premint Premint object from viem to convert to a JSON compatible type.\n * @returns JSON compatible premint\n */\nexport const encodePremintForAPI = ({\n tokenConfig,\n ...premint\n}: PremintConfig) => ({\n ...premint,\n tokenConfig: {\n ...tokenConfig,\n maxSupply: tokenConfig.maxSupply.toString(),\n pricePerToken: tokenConfig.pricePerToken.toString(),\n mintStart: tokenConfig.mintStart.toString(),\n mintDuration: tokenConfig.mintDuration.toString(),\n maxTokensPerAddress: tokenConfig.maxTokensPerAddress.toString(),\n },\n});\n\n/**\n * Preminter API to access ZORA Premint functionality.\n * Currently only supports V1 premints.\n */\nexport class PremintClient extends ClientBase {\n apiClient: typeof PremintAPIClient;\n\n constructor(chain: Chain, apiClient?: typeof PremintAPIClient) {\n super(chain);\n\n if (!apiClient) {\n apiClient = PremintAPIClient;\n }\n this.apiClient = apiClient;\n }\n\n /**\n * The premint executor address is deployed to the same address across all chains.\n * Can be overridden as needed by making a parent class.\n *\n * @returns Executor address for premints\n */\n getExecutorAddress() {\n return zoraCreator1155PremintExecutorImplAddress[999];\n }\n\n /**\n * The fixed price minter address is the same across all chains for our current\n * deployer strategy.\n * Can be overridden as needed by making a parent class.\n *\n * @returns Fixed price sale strategy\n */\n getFixedPriceMinterAddress() {\n return zoraCreatorFixedPriceSaleStrategyAddress[999];\n }\n\n /**\n * Update existing premint given collection address and UID of existing premint.\n *\n * 1. Loads existing premint token\n * 2. Updates with settings passed into function\n * 3. Increments the version field\n * 4. Re-signs the premint\n * 5. Uploads the premint to the ZORA API\n *\n * Updates existing premint\n * @param settings Settings for the new premint\n * @param settings.account Account to sign the premint update from. Taken from walletClient if none passed in.\n * @param settings.collection Collection information for the mint\n * @param settings.walletClient viem wallet client to use to sign\n * @param settings.uid UID\n * @param settings.token Mint argument settings, optional settings are overridden with sensible defaults.\n *\n */\n async updatePremint({\n walletClient,\n uid,\n collection,\n token,\n account,\n }: {\n walletClient: WalletClient;\n uid: number;\n token: MintArgumentsSettings;\n account?: Account | Address;\n collection: Address;\n }): Promise<SignedPremintResponse> {\n const signatureResponse = await this.apiClient.getSignature({\n chain_name: this.network.zoraBackendChainName,\n collection_address: collection.toLowerCase(),\n uid: uid,\n });\n\n const convertedPremint = convertPremint(signatureResponse.premint);\n const signerData = {\n ...signatureResponse,\n premint: {\n ...convertedPremint,\n tokenConfig: {\n ...convertedPremint.tokenConfig,\n ...token,\n },\n },\n };\n\n return await this.signAndSubmitPremint({\n walletClient,\n account,\n checkSignature: false,\n verifyingContract: collection,\n publicClient: this.getPublicClient(),\n uid: uid,\n collection: {\n ...signerData.collection,\n contractAdmin: signerData.collection.contractAdmin as Address,\n },\n premintConfig: signerData.premint,\n });\n }\n\n /**\n * Delete premint.\n *\n * 1. Loads current premint from collection address with UID\n * 2. Increments version and marks as deleted\n * 3. Signs new premint version\n * 4. Sends to ZORA Premint API\n *\n * Deletes existing premint\n * @param settings.collection collection address\n * @param settings.uid UID\n * @param settings.walletClient viem wallet client to use to sign\n *\n */\n async deletePremint({\n walletClient,\n uid,\n account,\n collection,\n publicClient,\n }: {\n walletClient: WalletClient;\n publicClient: PublicClient;\n uid: number;\n account?: Account | Address;\n collection: Address;\n }) {\n const signatureResponse = await this.apiClient.getSignature({\n chain_name: this.network.zoraBackendChainName,\n collection_address: collection.toLowerCase(),\n uid: uid,\n });\n\n const signerData = {\n ...signatureResponse,\n collection: convertCollection(signatureResponse.collection),\n premint: {\n ...convertPremint(signatureResponse.premint),\n deleted: true,\n },\n };\n\n return await this.signAndSubmitPremint({\n walletClient,\n account,\n checkSignature: false,\n verifyingContract: collection,\n publicClient: this.getPublicClient(publicClient),\n uid: uid,\n collection: signerData.collection,\n premintConfig: signerData.premint,\n });\n }\n\n /**\n * Internal function to sign and submit a premint request.\n *\n * @param premintArguments Arguments to premint\n * @returns\n */\n private async signAndSubmitPremint({\n walletClient,\n publicClient,\n verifyingContract,\n premintConfig,\n uid,\n account,\n checkSignature,\n collection,\n }: {\n publicClient: PublicClient;\n uid: number;\n walletClient: WalletClient;\n verifyingContract: Address;\n checkSignature: boolean;\n account?: Address | Account;\n premintConfig: PremintConfig;\n collection: PremintSignatureGetResponse[\"collection\"];\n }) {\n if (!account) {\n account = walletClient.account;\n }\n if (!account) {\n throw new Error(\"No account provided\");\n }\n\n const signature = await walletClient.signTypedData({\n account,\n ...preminterTypedDataDefinition({\n verifyingContract,\n premintConfig,\n chainId: this.chain.id,\n }),\n });\n\n if (checkSignature) {\n const [isValidSignature] = await publicClient.readContract({\n abi: zoraCreator1155PremintExecutorImplABI,\n address: this.getExecutorAddress(),\n functionName: \"isValidSignature\",\n args: [convertCollection(collection), premintConfig, signature],\n });\n if (!isValidSignature) {\n throw new Error(\"Invalid signature\");\n }\n }\n\n const apiData = {\n collection,\n premint: encodePremintForAPI(premintConfig),\n chain_name: this.network.zoraBackendChainName,\n signature: signature,\n };\n\n const premint = await this.apiClient.postSignature(apiData);\n\n return {\n urls: this.makeUrls({ address: verifyingContract, uid }),\n uid,\n verifyingContract,\n premint,\n };\n }\n\n /**\n * Create premint\n *\n * @param settings Settings for the new premint\n * @param settings.account Account to sign the premint with. Taken from walletClient if none passed in.\n * @param settings.collection Collection information for the mint\n * @param settings.token Mint argument settings, optional settings are overridden with sensible defaults.\n * @param settings.publicClient Public client (optional) – instantiated if not passed in with defaults.\n * @param settings.walletClient Required wallet client for signing the premint message.\n * @param settings.executionSettings Execution settings for premint options\n * @param settings.executionSettings.deleted If this UID should be deleted. If omitted, set to false.\n * @param settings.executionSettings.uid the UID to use – optional and retrieved as a fresh UID from ZORA by default.\n * @param settings.checkSignature if the signature should have a pre-flight check. Not required but helpful for debugging.\n * @returns premint url, uid, newContractAddress, and premint object\n */\n async createPremint({\n account,\n collection,\n token,\n publicClient,\n walletClient,\n executionSettings,\n checkSignature = false,\n }: {\n account: Address;\n checkSignature?: boolean;\n walletClient: WalletClient;\n collection: PremintSignatureGetResponse[\"collection\"];\n token: MintArgumentsSettings;\n publicClient?: PublicClient;\n executionSettings?: {\n deleted?: boolean;\n uid?: number;\n };\n }) {\n publicClient = this.getPublicClient(publicClient);\n\n const newContractAddress = await publicClient.readContract({\n address: this.getExecutorAddress(),\n abi: zoraCreator1155PremintExecutorImplABI,\n functionName: \"getContractAddress\",\n args: [convertCollection(collection)],\n });\n\n const tokenConfig = {\n ...DefaultMintArguments,\n fixedPriceMinter: this.getFixedPriceMinterAddress(),\n royaltyRecipient: account,\n ...token,\n };\n\n let uid = executionSettings?.uid;\n if (!uid) {\n const uidResponse = await this.apiClient.getNextUID({\n chain_name: this.network.zoraBackendChainName,\n collection_address: newContractAddress.toLowerCase(),\n });\n uid = uidResponse.next_uid;\n }\n\n if (!uid) {\n throw new Error(\"UID is missing but required\");\n }\n\n let deleted = executionSettings?.deleted || false;\n\n const premintConfig = {\n tokenConfig: tokenConfig,\n uid,\n version: 1,\n deleted,\n };\n\n return await this.signAndSubmitPremint({\n uid,\n verifyingContract: newContractAddress,\n premintConfig,\n checkSignature,\n account,\n publicClient,\n walletClient,\n collection,\n });\n }\n\n /**\n * Fetches given premint data from the ZORA API.\n *\n * @param address Address for the premint contract\n * @param uid UID for the desired premint\n * @returns PremintSignatureGetResponse of premint data from the API\n */\n async getPremintData({\n address,\n uid,\n }: {\n address: string;\n uid: number;\n }): Promise<PremintSignatureGetResponse> {\n return await this.apiClient.getSignature({\n chain_name: this.network.zoraBackendChainName,\n collection_address: address,\n uid,\n });\n }\n\n /**\n * Check user signature for v1\n *\n * @param data Signature data from the API\n * @returns isValid = signature is valid or not, contractAddress = assumed contract address, recoveredSigner = signer from contract\n */\n async isValidSignature({\n data,\n publicClient,\n }: {\n data: PremintSignatureGetResponse;\n publicClient?: PublicClient;\n }): Promise<{\n isValid: boolean;\n contractAddress: Address;\n recoveredSigner: Address;\n }> {\n publicClient = this.getPublicClient(publicClient);\n\n const [isValid, contractAddress, recoveredSigner] =\n await publicClient.readContract({\n abi: zoraCreator1155PremintExecutorImplABI,\n address: this.getExecutorAddress(),\n functionName: \"isValidSignature\",\n args: [\n convertCollection(data.collection),\n convertPremint(data.premint),\n data.signature as Hex,\n ],\n });\n\n return { isValid, contractAddress, recoveredSigner };\n }\n\n protected makeUrls({\n uid,\n address,\n tokenId,\n }: {\n uid?: number;\n tokenId?: bigint;\n address?: Address;\n }): URLSReturnType {\n if ((!uid || !tokenId) && !address) {\n return { explorer: null, zoraCollect: null, zoraManage: null };\n }\n\n const zoraTokenPath = uid ? `premint-${uid}` : tokenId;\n\n return {\n explorer: tokenId\n ? `https://${this.chain.blockExplorers?.default.url}/token/${address}/instance/${tokenId}`\n : null,\n zoraCollect: `https://${\n this.network.isTestnet ? \"testnet.\" : \"\"\n }zora.co/collect/${\n this.network.zoraPathChainName\n }:${address}/${zoraTokenPath}`,\n zoraManage: `https://${\n this.network.isTestnet ? \"testnet.\" : \"\"\n }zora.co/collect/${\n this.network.zoraPathChainName\n }:${address}/${zoraTokenPath}`,\n };\n }\n\n /**\n * Execute premint on-chain\n *\n * @param settings.data Data from the API for the mint\n * @param settings.account Optional account (if omitted taken from wallet client) for the account executing the premint.\n * @param settings.walletClient WalletClient to send execution from.\n * @param settings.mintArguments User minting arguments.\n * @param settings.mintArguments.quantityToMint Quantity to mint, optional, defaults to 1.\n * @param settings.mintArguments.mintComment Optional mint comment, optional, omits when not included.\n * @param settings.publicClient Optional public client for preflight checks.\n * @returns receipt, log, zoraURL\n */\n async executePremintWithWallet({\n data,\n account,\n walletClient,\n mintArguments,\n publicClient,\n }: {\n data: PremintSignatureGetResponse;\n walletClient: WalletClient;\n account?: Account | Address;\n mintArguments?: {\n quantityToMint: number;\n mintComment?: string;\n };\n publicClient?: PublicClient;\n }): Promise<ExecutedPremintResponse> {\n publicClient = this.getPublicClient(publicClient);\n\n if (mintArguments && mintArguments?.quantityToMint < 1) {\n throw new Error(\"Quantity to mint cannot be below 1\");\n }\n\n const targetAddress = this.getExecutorAddress();\n const numberToMint = BigInt(mintArguments?.quantityToMint || 1);\n const args = [\n convertCollection(data.collection),\n convertPremint(data.premint),\n data.signature as Hex,\n numberToMint,\n mintArguments?.mintComment || \"\",\n ] as const;\n\n if (!account) {\n account = walletClient.account;\n }\n\n if (!account) {\n throw new Error(\"Wallet not passed in\");\n }\n\n const value = numberToMint * REWARD_PER_TOKEN;\n\n const { request } = await publicClient.simulateContract({\n account,\n abi: zoraCreator1155PremintExecutorImplABI,\n functionName: \"premint\",\n value,\n address: targetAddress,\n args,\n });\n const hash = await walletClient.writeContract(request);\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n const premintedLog = getPremintedLogFromReceipt(receipt);\n\n return {\n receipt,\n premintedLog,\n urls: this.makeUrls({\n address: premintedLog?.contractAddress,\n tokenId: premintedLog?.tokenId,\n }),\n };\n }\n}\n","import { Address } from \"abitype\";\nimport { ExtractAbiFunction, AbiParametersToPrimitiveTypes } from \"abitype\";\nimport { zoraCreator1155PremintExecutorImplABI as preminterAbi } from \"@zoralabs/protocol-deployments\";\nimport { TypedDataDefinition } from \"viem\";\n\ntype PremintInputs = ExtractAbiFunction<\n typeof preminterAbi,\n \"premint\"\n>[\"inputs\"];\n\ntype PreminterHashDataTypes = AbiParametersToPrimitiveTypes<PremintInputs>;\n\nexport type ContractCreationConfig = PreminterHashDataTypes[0];\nexport type PremintConfig = PreminterHashDataTypes[1];\nexport type TokenCreationConfig = PremintConfig[\"tokenConfig\"];\n\n// Convenience method to create the structured typed data\n// needed to sign for a premint contract and token\nexport const preminterTypedDataDefinition = ({\n verifyingContract,\n premintConfig,\n chainId,\n}: {\n verifyingContract: Address;\n premintConfig: PremintConfig;\n chainId: number;\n}) => {\n const { tokenConfig, uid, version, deleted } = premintConfig;\n const types = {\n CreatorAttribution: [\n { name: \"tokenConfig\", type: \"TokenCreationConfig\" },\n // unique id scoped to the contract and token to create.\n // ensure that a signature can be replaced, as long as the replacement\n // has the same uid, and a newer version.\n { name: \"uid\", type: \"uint32\" },\n { name: \"version\", type: \"uint32\" },\n // if this update should result in the signature being deleted.\n { name: \"deleted\", type: \"bool\" },\n ],\n TokenCreationConfig: [\n { name: \"tokenURI\", type: \"string\" },\n { name: \"maxSupply\", type: \"uint256\" },\n { name: \"maxTokensPerAddress\", type: \"uint64\" },\n { name: \"pricePerToken\", type: \"uint96\" },\n { name: \"mintStart\", type: \"uint64\" },\n { name: \"mintDuration\", type: \"uint64\" },\n { name: \"royaltyMintSchedule\", type: \"uint32\" },\n { name: \"royaltyBPS\", type: \"uint32\" },\n { name: \"royaltyRecipient\", type: \"address\" },\n { name: \"fixedPriceMinter\", type: \"address\" },\n ],\n };\n\n const result: TypedDataDefinition<typeof types, \"CreatorAttribution\"> = {\n domain: {\n chainId,\n name: \"Preminter\",\n version: \"1\",\n verifyingContract: verifyingContract,\n },\n types,\n message: {\n tokenConfig,\n uid,\n version,\n deleted,\n },\n primaryType: \"CreatorAttribution\",\n };\n\n return result;\n};\n","export class BadResponseError<T = any> extends Error {\n status: number;\n json: T;\n constructor(message: string, status: number, json: any) {\n super(message);\n this.name = \"BadResponseError\";\n this.status = status;\n this.json = json;\n }\n}\n\nasync function wait(delayMs: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, delayMs);\n });\n}\n\n/**\n * A simple fetch() wrapper for HTTP gets.\n * Can be overridden as needed.\n *\n * @param path Path to run HTTP JSON get against\n * @returns JSON object response\n * @throws Error when HTTP response fails\n */\nexport const get = async <T>(url: string) => {\n const response = await fetch(url, { method: \"GET\" });\n if (response.status !== 200) {\n let json;\n try {\n json = await response.json();\n } catch (e: any) {}\n throw new BadResponseError(\n `Invalid response, status ${response.status}`,\n response.status,\n json,\n );\n }\n return (await response.json()) as T;\n};\n\n/**\n * A simple fetch() wrapper for HTTP post.\n * Can be overridden as needed.\n *\n * @param path Path to run HTTP JSON POST against\n * @param data Data to POST to the server, converted to JSON\n * @returns JSON object response\n * @throws Error when HTTP response fails\n */\nexport const post = async <T>(url: string, data: any) => {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n },\n body: JSON.stringify(data),\n });\n if (response.status !== 200) {\n let json;\n try {\n json = await response.json();\n } catch (e: any) {}\n throw new BadResponseError(\n `Bad response: ${response.status}`,\n response.status,\n json,\n );\n }\n return (await response.json()) as T;\n};\n\nexport const retries = async <T>(\n tryFn: () => T,\n maxTries: number = 3,\n atTry: number = 1,\n linearBackoffMS: number = 200,\n): Promise<T> => {\n try {\n return await tryFn();\n } catch (err: any) {\n if (err instanceof BadResponseError) {\n if (err.status >= 500) {\n if (atTry <= maxTries) {\n await wait(atTry * linearBackoffMS);\n return await retries(tryFn, maxTries, atTry + 1);\n }\n }\n }\n throw err;\n }\n};\n","export const ZORA_API_BASE = \"https://api.zora.co/\";\nexport const OPEN_EDITION_MINT_SIZE = BigInt(\"18446744073709551615\");\n\n// Subgraph base settings\nconst SUBGRAPH_CONFIG_BASE =\n \"https://api.goldsky.com/api/public/project_clhk16b61ay9t49vm6ntn4mkz/subgraphs\";\n\nexport function getSubgraph(name: string, version: string): string {\n return `${SUBGRAPH_CONFIG_BASE}/${name}/${version}/gn`;\n}\n","import { post, retries, get } from \"../apis/http-api-base\";\nimport { components, paths } from \"../apis/generated/premint-api-types\";\nimport { ZORA_API_BASE } from \"../constants\";\n\ntype SignaturePostType = paths[\"/signature\"][\"post\"];\ntype PremintSignatureRequestBody =\n SignaturePostType[\"requestBody\"][\"content\"][\"application/json\"];\nexport type PremintSignatureResponse =\n SignaturePostType[\"responses\"][200][\"content\"][\"application/json\"];\n\ntype PremintNextUIDGetType =\n paths[\"/signature/{chain_name}/{collection_address}/next_uid\"][\"get\"];\ntype PremintNextUIDGetPathParameters =\n PremintNextUIDGetType[\"parameters\"][\"path\"];\nexport type PremintNextUIDGetResponse =\n PremintNextUIDGetType[\"responses\"][200][\"content\"][\"application/json\"];\n\ntype SignaturePremintGetType =\n paths[\"/signature/{chain_name}/{collection_address}/{uid}\"][\"get\"];\ntype PremintSignatureGetPathParameters =\n SignaturePremintGetType[\"parameters\"][\"path\"];\nexport type PremintSignatureGetResponse =\n SignaturePremintGetType[\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type BackendChainNames = components[\"schemas\"][\"ChainName\"];\n\nconst postSignature = async (\n data: PremintSignatureRequestBody,\n): Promise<PremintSignatureResponse> =>\n retries(() =>\n post<PremintSignatureResponse>(`${ZORA_API_BASE}premint/signature`, data),\n );\n\nconst getNextUID = async (\n path: PremintNextUIDGetPathParameters,\n): Promise<PremintNextUIDGetResponse> =>\n retries(() =>\n get<PremintNextUIDGetResponse>(\n `${ZORA_API_BASE}premint/signature/${path.chain_name}/${path.collection_address}/next_uid`,\n ),\n );\n\nconst getSignature = async (\n path: PremintSignatureGetPathParameters,\n): Promise<PremintSignatureGetResponse> =>\n retries(() =>\n get<PremintSignatureGetResponse>(\n `${ZORA_API_BASE}premint/signature/${path.chain_name}/${path.collection_address}/${path.uid}`,\n ),\n );\n\nexport const PremintAPIClient = {\n postSignature,\n getSignature,\n getNextUID,\n};\nexport { ZORA_API_BASE };\n","import { Chain, PublicClient, createPublicClient, http } from \"viem\";\nimport { NetworkConfig, networkConfigByChain } from \"./chain-constants\";\n\nexport abstract class ClientBase {\n network: NetworkConfig;\n chain: Chain;\n\n constructor(chain: Chain) {\n this.chain = chain;\n const networkConfig = networkConfigByChain[chain.id];\n if (!networkConfig) {\n throw new Error(`Not configured for chain ${chain.id}`);\n }\n this.network = networkConfig;\n }\n\n /**\n * Getter for public client that instantiates a publicClient as needed\n *\n * @param publicClient Optional viem public client\n * @returns Existing public client or makes a new one for the given chain as needed.\n */\n protected getPublicClient(publicClient?: PublicClient): PublicClient {\n if (publicClient) {\n return publicClient;\n }\n return createPublicClient({ chain: this.chain, transport: http() });\n }\n}\n","import {\n base,\n baseGoerli,\n foundry,\n goerli,\n mainnet,\n optimism,\n optimismGoerli,\n zora,\n zoraTestnet,\n} from \"viem/chains\";\nimport type { components } from \"./generated/premint-api-types\";\nimport { parseEther } from \"viem\";\nimport { getSubgraph } from \"../constants\";\n\nexport type NetworkConfig = {\n chainId: number;\n zoraPathChainName: string;\n zoraBackendChainName: components[\"schemas\"][\"ChainName\"];\n isTestnet: boolean;\n subgraphUrl: string;\n};\n\nexport const REWARD_PER_TOKEN = parseEther(\"0.000777\");\n\nexport const BackendChainNamesLookup = {\n ZORA_MAINNET: \"ZORA-MAINNET\",\n ZORA_GOERLI: \"ZORA-GOERLI\",\n OPTIMISM_MAINNET: \"OPTIMISM-MAINNET\",\n OPTIMISM_GOERLI: \"OPTIMISM-GOERLI\",\n ETHEREUM_MAINNET: \"ETHEREUM-MAINNET\",\n ETHEREUM_GOERLI: \"ETHEREUM-GOERLI\",\n BASE_MAINNET: \"BASE-MAINNET\",\n BASE_GOERLI: \"BASE-GOERLI\",\n} as const;\n\nexport const networkConfigByChain: Record<number, NetworkConfig> = {\n [mainnet.id]: {\n chainId: mainnet.id,\n isTestnet: false,\n zoraPathChainName: \"eth\",\n zoraBackendChainName: BackendChainNamesLookup.ETHEREUM_MAINNET,\n subgraphUrl: getSubgraph(\"zora-create-mainnet\", \"stable\"),\n },\n [goerli.id]: {\n chainId: goerli.id,\n isTestnet: true,\n zoraPathChainName: \"gor\",\n zoraBackendChainName: BackendChainNamesLookup.ETHEREUM_GOERLI,\n subgraphUrl: getSubgraph(\"zora-create-goerli\", \"stable\"),\n },\n [zora.id]: {\n chainId: zora.id,\n isTestnet: false,\n zoraPathChainName: \"zora\",\n zoraBackendChainName: BackendChainNamesLookup.ZORA_MAINNET,\n subgraphUrl: getSubgraph(\"zora-create-zora-mainnet\", \"stable\"),\n },\n [zoraTestnet.id]: {\n chainId: zora.id,\n isTestnet: true,\n zoraPathChainName: \"zgor\",\n zoraBackendChainName: BackendChainNamesLookup.ZORA_GOERLI,\n subgraphUrl: getSubgraph(\"zora-create-zora-testnet\", \"stable\"),\n },\n [optimism.id]: {\n chainId: optimism.id,\n isTestnet: false,\n zoraPathChainName: \"opt\",\n zoraBackendChainName: BackendChainNamesLookup.OPTIMISM_MAINNET,\n subgraphUrl: getSubgraph(\"zora-create-optimism\", \"stable\"),\n },\n [optimismGoerli.id]: {\n chainId: optimismGoerli.id,\n isTestnet: true,\n zoraPathChainName: \"ogor\",\n zoraBackendChainName: BackendChainNamesLookup.OPTIMISM_GOERLI,\n subgraphUrl: getSubgraph(\"zora-create-optimism-goerli\", \"stable\"),\n },\n [base.id]: {\n chainId: base.id,\n isTestnet: false,\n zoraPathChainName: \"base\",\n zoraBackendChainName: BackendChainNamesLookup.BASE_MAINNET,\n subgraphUrl: getSubgraph(\"zora-create-base-mainnet\", \"stable\"),\n },\n [baseGoerli.id]: {\n chainId: baseGoerli.id,\n isTestnet: true,\n zoraPathChainName: \"bgor\",\n zoraBackendChainName: BackendChainNamesLookup.BASE_GOERLI,\n subgraphUrl: getSubgraph(\"zora-create-base-goerli\", \"stable\"),\n },\n [foundry.id]: {\n chainId: foundry.id,\n isTestnet: true,\n zoraPathChainName: \"zgor\",\n zoraBackendChainName: BackendChainNamesLookup.ZORA_GOERLI,\n subgraphUrl: getSubgraph(\"zora-create-zora-testnet\", \"stable\"),\n },\n};\n","import { retries, get, post } from \"../apis/http-api-base\";\nimport { paths } from \"../apis/generated/discover-api-types\";\nimport { ZORA_API_BASE } from \"../constants\";\n\nexport type MintableGetToken =\n paths[\"/mintables/{chain_name}/{collection_address}\"];\ntype MintableGetTokenPathParameters =\n MintableGetToken[\"get\"][\"parameters\"][\"path\"];\ntype MintableGetTokenGetQueryParameters =\n MintableGetToken[\"get\"][\"parameters\"][\"query\"];\nexport type MintableGetTokenResponse =\n MintableGetToken[\"get\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nfunction encodeQueryParameters(params: Record<string, string>) {\n return new URLSearchParams(params).toString();\n}\n\nconst getMintable = async (\n path: MintableGetTokenPathParameters,\n query: MintableGetTokenGetQueryParameters,\n): Promise<MintableGetTokenResponse> =>\n retries(() => {\n return get<MintableGetTokenResponse>(\n `${ZORA_API_BASE}discover/mintables/${path.chain_name}/${\n path.collection_address\n }${query?.token_id ? `?${encodeQueryParameters(query)}` : \"\"}`,\n );\n });\n\nexport const getSalesConfigFixedPrice = async ({\n contractAddress,\n tokenId,\n subgraphUrl,\n}: {\n contractAddress: string;\n tokenId: string;\n subgraphUrl: string;\n}): Promise<undefined | string> =>\n retries(async () => {\n const response = await post<any>(subgraphUrl, {\n query:\n \"query($id: ID!) {\\n zoraCreateToken(id: $id) {\\n id\\n salesStrategies{\\n fixedPrice {\\n address\\n }\\n }\\n }\\n}\",\n variables: { id: `${contractAddress.toLowerCase()}-${tokenId}` },\n });\n return response.zoraCreateToken?.salesStrategies?.find(() => true)\n ?.fixedPriceMinterAddress;\n });\n\nexport const MintAPIClient = {\n getMintable,\n getSalesConfigFixedPrice,\n};\n","import {\n zoraCreator1155FactoryImplABI,\n zoraCreator1155FactoryImplAddress,\n zoraCreator1155ImplABI,\n zoraCreatorFixedPriceSaleStrategyABI,\n} from \"@zoralabs/protocol-deployments\";\nimport type {\n Address,\n Hex,\n PublicClient,\n TransactionReceipt,\n WalletClient,\n} from \"viem\";\nimport { decodeEventLog, encodeFunctionData, zeroAddress } from \"viem\";\nimport { OPEN_EDITION_MINT_SIZE } from \"../constants\";\n\n// Sales end forever amount (uint64 max)\nconst SALE_END_FOREVER = 18446744073709551615n;\n\n// Default royalty bps\nconst ROYALTY_BPS_DEFAULT = 1000;\n\ntype SalesConfigParamsType = {\n // defaults to 0\n pricePerToken?: bigint;\n // defaults to 0, in seconds\n saleStart?: bigint;\n // defaults to forever, in seconds\n saleEnd?: bigint;\n // max tokens that can be minted per address\n maxTokensPerAddress?: bigint;\n fundsRecipient?: Address;\n};\n\nexport const DEFAULT_SALE_SETTINGS = {\n fundsRecipient: zeroAddress,\n // Free Mint\n pricePerToken: 0n,\n // Sale start time – defaults to beginning of unix time\n saleStart: 0n,\n // This is the end of uint64, plenty of time\n saleEnd: SALE_END_FOREVER,\n // 0 Here means no limit\n maxTokensPerAddress: 0n,\n};\n\n// Hardcode the permission bit for the minter\nconst PERMISSION_BIT_MINTER = 2n ** 2n;\n\ntype ContractType =\n | {\n name: string;\n uri: string;\n defaultAdmin?: Address;\n }\n | Address;\n\ntype RoyaltySettingsType = {\n royaltyBPS: number;\n royaltyRecipient: Address;\n};\n\nexport function create1155TokenSetupArgs({\n nextTokenId,\n // How many NFTs upon initialization to mint to the creator\n mintToCreatorCount,\n tokenMetadataURI,\n // Fixed price minter address – required minter\n fixedPriceMinterAddress,\n // Address to use as the create referral, optional.\n createReferral,\n // Optional max supply of the token. Default unlimited\n maxSupply,\n // wallet sending the transaction\n account,\n salesConfig,\n royaltySettings,\n}: {\n maxSupply?: bigint | number;\n createReferral?: Address;\n nextTokenId: bigint;\n mintToCreatorCount: bigint | number;\n // wallet sending the transaction\n account: Address;\n tokenMetadataURI: string;\n fixedPriceMinterAddress: Address;\n salesConfig: SalesConfigParamsType;\n royaltySettings?: RoyaltySettingsType;\n}) {\n if (!maxSupply) {\n maxSupply = OPEN_EDITION_MINT_SIZE;\n }\n maxSupply = BigInt(maxSupply);\n mintToCreatorCount = BigInt(mintToCreatorCount);\n\n const salesConfigWithDefaults = {\n // Set static sales default.\n ...DEFAULT_SALE_SETTINGS,\n // Override with user settings.\n ...salesConfig,\n };\n\n const setupActions = [\n encodeFunctionData({\n abi: zoraCreator1155ImplABI,\n functionName: \"addPermission\",\n args: [0n, fixedPriceMinterAddress, PERMISSION_BIT_MINTER],\n }),\n encodeFunctionData({\n abi: zoraCreator1155ImplABI,\n functionName: \"assumeLastTokenIdMatches\",\n args: [nextTokenId - 1n],\n }),\n createReferral\n ? encodeFunctionData({\n abi: zoraCreator1155ImplABI,\n functionName: \"setupNewTokenWithCreateReferral\",\n args: [tokenMetadataURI, maxSupply, createReferral],\n })\n : encodeFunctionData({\n abi: zoraCreator1155ImplABI,\n functionName: \"setupNewToken\",\n args: [tokenMetadataURI, maxSupply],\n }),\n encodeFunctionData({\n abi: zoraCreator1155ImplABI,\n functionName: \"callSale\",\n args: [\n nextTokenId,\n fixedPriceMinterAddress,\n encodeFunctionData({\n abi: zoraCreatorFixedPriceSaleStrategyABI,\n functionName: \"setSale\",\n args: [nextTokenId, salesConfigWithDefaults],\n }),\n ],\n }),\n ];\n\n if (mintToCreatorCount) {\n setupActions.push(\n encodeFunctionData({\n abi: zoraCreator1155ImplABI,\n functionName: \"adminMint\",\n args: [account, nextTokenId, mintToCreatorCount, \"0x\"],\n }),\n );\n }\n\n if (royaltySettings) {\n setupActions.push(\n encodeFunctionData({\n abi: zoraCreator1155ImplABI,\n functionName: \"updateRoyaltiesForToken\",\n args: [\n nextTokenId,\n {\n royaltyMintSchedule: 0,\n royaltyBPS: royaltySettings?.royaltyBPS || ROYALTY_BPS_DEFAULT,\n royaltyRecipient: royaltySettings?.royaltyRecipient || account,\n },\n ],\n }),\n );\n }\n\n return setupActions;\n}\n\nexport const getTokenIdFromCreateReceipt = (\n receipt: TransactionReceipt,\n): bigint | undefined => {\n for (const data of receipt.logs) {\n try {\n const decodedLog = decodeEventLog({\n abi: zoraCreator1155ImplABI,\n eventName: \"SetupNewToken\",\n ...data,\n });\n if (decodedLog && decodedLog.eventName === \"SetupNewToken\") {\n return decodedLog.args.tokenId;\n }\n } catch (err: any) {}\n }\n};\n\nasync function getContractExists(\n publicClient: PublicClient,\n contract: ContractType,\n // Account that is the creator of the contract\n account: Address,\n) {\n let contractAddress;\n let contractExists = false;\n if (typeof contract !== \"string\") {\n contractAddress = await publicClient.readContract({\n abi: zoraCreator1155FactoryImplABI,\n // Since this address is deterministic we can hardcode a chain id safely here.\n address: zoraCreator1155FactoryImplAddress[999],\n functionName: \"deterministicContractAddress\",\n args: [\n account,\n contract.uri,\n contract.name,\n contract.defaultAdmin || account,\n ],\n });\n\n try {\n await publicClient.readContract({\n abi: zoraCreator1155ImplABI,\n address: contractAddress,\n functionName: \"contractVersion\",\n });\n contractExists = true;\n } catch (e: any) {\n // This logic branch is hit if the contract doesn't exist\n // falling back to contractExists to false.\n }\n return { contractAddress, contractExists };\n }\n\n return {\n contractExists: true,\n contractAddress: contract,\n };\n}\n\n// Create new 1155 token\nexport async function createNew1155Token({\n publicClient,\n contract,\n tokenMetadataURI,\n mintToCreatorCount = 1,\n salesConfig = {},\n maxSupply,\n account,\n royaltySettings,\n getAdditionalSetupActions,\n}: {\n publicClient: PublicClient;\n account: Address;\n maxSupply?: bigint | number;\n royaltySettings?: RoyaltySettingsType;\n royaltyBPS?: number;\n contract: ContractType;\n tokenMetadataURI: string;\n mintToCreatorCount?: bigint | number;\n salesConfig?: SalesConfigParamsType;\n getAdditionalSetupActions?: (args: {\n tokenId: bigint;\n contractAddress: Address;\n }) => Hex[];\n}) {\n // Check if contract exists either from metadata or the static address passed in.\n // If a static address is passed in, this fails if that contract does not exist.\n const { contractExists, contractAddress } = await getContractExists(\n publicClient,\n contract,\n account,\n );\n\n // Assume the next token id is the first token available for a new contract.\n let nextTokenId = 1n;\n\n if (contractExists) {\n nextTokenId = await publicClient.readContract({\n abi: zoraCreator1155ImplABI,\n functionName: \"nextTokenId\",\n address: contractAddress,\n });\n }\n\n // Get the fixed price minter to use within the new token to set the sales configuration.\n const fixedPriceMinterAddress = await publicClient.readContract({\n abi: zoraCreator1155FactoryImplABI,\n address: zoraCreator1155FactoryImplAddress[999],\n functionName: \"fixedPriceMinter\",\n });\n\n let tokenSetupActions = create1155TokenSetupArgs({\n tokenMetadataURI,\n nextTokenId,\n salesConfig,\n maxSupply,\n fixedPriceMinterAddress,\n account,\n mintToCreatorCount,\n royaltySettings,\n });\n if (getAdditionalSetupActions) {\n tokenSetupActions = [\n ...getAdditionalSetupActions({ tokenId: nextTokenId, contractAddress }),\n ...tokenSetupActions,\n ];\n }\n\n if (!contractAddress && typeof contract === \"string\") {\n throw new Error(\"Invariant: contract cannot be missing and an address\");\n }\n if (!contractExists && typeof contract !== \"string\") {\n const { request } = await publicClient.simulateContract({\n abi: zoraCreator1155FactoryImplABI,\n functionName: \"createContractDeterministic\",\n account,\n address: zoraCreator1155FactoryImplAddress[999],\n args: [\n contract.uri,\n contract.name,\n {\n // deprecated\n royaltyMintSchedule: 0,\n royaltyBPS: royaltySettings?.royaltyBPS || ROYALTY_BPS_DEFAULT,\n royaltyRecipient: royaltySettings?.royaltyRecipient || account,\n },\n contract.defaultAdmin || account,\n tokenSetupActions,\n ],\n });\n return {\n send: (walletClient: WalletClient) => walletClient.writeContract(request),\n tokenSetupActions,\n contractAddress,\n contractExists,\n };\n } else if (contractExists) {\n const { request } = await publicClient.simulateContract({\n abi: zoraCreator1155ImplABI,\n functionName: \"multicall\",\n account,\n address: contractAddress,\n args: [tokenSetupActions],\n });\n return {\n send: (walletClient: WalletClient) => walletClient.writeContract(request),\n tokenSetupActions,\n contractAddress,\n contractExists,\n };\n }\n throw new Error(\"Unsupported contract argument type\");\n}\n"],"mappings":"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","names":["import_viem","import_viem","import_protocol_deployments","import_viem"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/premint/premint-client.ts","../src/premint/preminter.ts","../src/apis/http-api-base.ts","../src/constants.ts","../src/premint/premint-api-client.ts","../src/apis/client-base.ts","../src/apis/chain-constants.ts","../src/mint/mint-api-client.ts","../src/create/1155-create-helper.ts"],"sourcesContent":["export * from \"./premint/premint-client\";\n\nexport * from \"./premint/preminter\";\n\nexport * from \"./premint/premint-api-client\";\n\nexport * from \"./mint/mint-api-client\";\n\nexport * from \"./create/1155-create-helper\";\n","import { decodeEventLog } from \"viem\";\nimport type {\n Account,\n Address,\n Chain,\n Hex,\n PublicClient,\n SimulateContractParameters,\n TransactionReceipt,\n WalletClient,\n} from \"viem\";\nimport {\n zoraCreator1155PremintExecutorImplABI,\n zoraCreator1155PremintExecutorImplAddress,\n zoraCreatorFixedPriceSaleStrategyAddress,\n} from \"@zoralabs/protocol-deployments\";\nimport { PremintConfig, preminterTypedDataDefinition } from \"./preminter\";\nimport type {\n PremintSignatureGetResponse,\n PremintSignatureResponse,\n} from \"./premint-api-client\";\nimport { PremintAPIClient } from \"./premint-api-client\";\nimport type { DecodeEventLogReturnType } from \"viem\";\nimport { ClientBase } from \"../apis/client-base\";\nimport { OPEN_EDITION_MINT_SIZE } from \"../constants\";\nimport { REWARD_PER_TOKEN } from \"src/apis/chain-constants\";\n\ntype MintArgumentsSettings = {\n tokenURI: string;\n maxSupply?: bigint;\n maxTokensPerAddress?: bigint;\n pricePerToken?: bigint;\n mintStart?: bigint;\n mintDuration?: bigint;\n royaltyMintSchedule?: number;\n royaltyBPS?: number;\n royaltyRecipient?: Address;\n fixedPriceMinter?: Address;\n};\n\ntype PremintedLogType = DecodeEventLogReturnType<\n typeof zoraCreator1155PremintExecutorImplABI,\n \"Preminted\"\n>[\"args\"];\n\ntype URLSReturnType = {\n explorer: null | string;\n zoraCollect: null | string;\n zoraManage: null | string;\n};\n\ntype SignedPremintResponse = {\n urls: URLSReturnType;\n uid: number;\n verifyingContract: Address;\n premint: PremintSignatureResponse;\n};\n\nexport const DefaultMintArguments = {\n maxSupply: OPEN_EDITION_MINT_SIZE,\n maxTokensPerAddress: 0n,\n pricePerToken: 0n,\n mintDuration: BigInt(60 * 60 * 24 * 7), // 1 week\n mintStart: 0n,\n royaltyMintSchedule: 0,\n royaltyBPS: 1000, // 10%,\n};\n\n/**\n * Gets the preminted log from receipt\n *\n * @param receipt Preminted log from receipt\n * @returns Premint event arguments\n */\nexport function getPremintedLogFromReceipt(\n receipt: TransactionReceipt,\n): PremintedLogType | undefined {\n for (const data of receipt.logs) {\n try {\n const decodedLog = decodeEventLog({\n abi: zoraCreator1155PremintExecutorImplABI,\n eventName: \"Preminted\",\n ...data,\n });\n if (decodedLog.eventName === \"Preminted\") {\n return decodedLog.args;\n }\n } catch (err: any) {}\n }\n}\n\n/**\n * Convert server to on-chain types for a premint\n *\n * @param premint Premint object from the server to convert to one that's compatible with viem\n * @returns Viem type-compatible premint object\n */\nexport const convertPremint = (\n premint: PremintSignatureGetResponse[\"premint\"],\n) => ({\n ...premint,\n tokenConfig: {\n ...premint.tokenConfig,\n fixedPriceMinter: premint.tokenConfig.fixedPriceMinter as Address,\n royaltyRecipient: premint.tokenConfig.royaltyRecipient as Address,\n maxSupply: BigInt(premint.tokenConfig.maxSupply),\n pricePerToken: BigInt(premint.tokenConfig.pricePerToken),\n mintStart: BigInt(premint.tokenConfig.mintStart),\n mintDuration: BigInt(premint.tokenConfig.mintDuration),\n maxTokensPerAddress: BigInt(premint.tokenConfig.maxTokensPerAddress),\n },\n});\n\nexport const convertCollection = (\n collection: PremintSignatureGetResponse[\"collection\"],\n) => ({\n ...collection,\n contractAdmin: collection.contractAdmin as Address,\n});\n\n/**\n * Convert on-chain types for a premint to a server safe type\n *\n * @param premint Premint object from viem to convert to a JSON compatible type.\n * @returns JSON compatible premint\n */\nexport const encodePremintForAPI = ({\n tokenConfig,\n ...premint\n}: PremintConfig) => ({\n ...premint,\n tokenConfig: {\n ...tokenConfig,\n maxSupply: tokenConfig.maxSupply.toString(),\n pricePerToken: tokenConfig.pricePerToken.toString(),\n mintStart: tokenConfig.mintStart.toString(),\n mintDuration: tokenConfig.mintDuration.toString(),\n maxTokensPerAddress: tokenConfig.maxTokensPerAddress.toString(),\n },\n});\n\n/**\n * Preminter API to access ZORA Premint functionality.\n * Currently only supports V1 premints.\n */\nclass PremintClient extends ClientBase {\n apiClient: typeof PremintAPIClient;\n\n constructor(chain: Chain, apiClient?: typeof PremintAPIClient) {\n super(chain);\n\n if (!apiClient) {\n apiClient = PremintAPIClient;\n }\n this.apiClient = apiClient;\n }\n\n /**\n * The premint executor address is deployed to the same address across all chains.\n * Can be overridden as needed by making a parent class.\n *\n * @returns Executor address for premints\n */\n getExecutorAddress() {\n return zoraCreator1155PremintExecutorImplAddress[999];\n }\n\n /**\n * The fixed price minter address is the same across all chains for our current\n * deployer strategy.\n * Can be overridden as needed by making a parent class.\n *\n * @returns Fixed price sale strategy\n */\n getFixedPriceMinterAddress() {\n return zoraCreatorFixedPriceSaleStrategyAddress[999];\n }\n\n getDataFromPremintReceipt(receipt: TransactionReceipt) {\n const premintedLog = getPremintedLogFromReceipt(receipt);\n return {\n premintedLog,\n urls: this.makeUrls({\n address: premintedLog?.contractAddress,\n tokenId: premintedLog?.tokenId,\n }),\n };\n }\n\n /**\n * Update existing premint given collection address and UID of existing premint.\n *\n * 1. Loads existing premint token\n * 2. Updates with settings passed into function\n * 3. Increments the version field\n * 4. Re-signs the premint\n * 5. Uploads the premint to the ZORA API\n *\n * Updates existing premint\n * @param settings Settings for the new premint\n * @param settings.account Account to sign the premint update from. Taken from walletClient if none passed in.\n * @param settings.collection Collection information for the mint\n * @param settings.walletClient viem wallet client to use to sign\n * @param settings.uid UID\n * @param settings.token Mint argument settings, optional settings are overridden with sensible defaults.\n *\n */\n async updatePremint({\n walletClient,\n uid,\n collection,\n token,\n account,\n }: {\n walletClient: WalletClient;\n uid: number;\n token: MintArgumentsSettings;\n account?: Account | Address;\n collection: Address;\n }): Promise<SignedPremintResponse> {\n const signatureResponse = await this.apiClient.getSignature({\n chain_name: this.network.zoraBackendChainName,\n collection_address: collection.toLowerCase(),\n uid: uid,\n });\n\n const convertedPremint = convertPremint(signatureResponse.premint);\n const signerData = {\n ...signatureResponse,\n premint: {\n ...convertedPremint,\n tokenConfig: {\n ...convertedPremint.tokenConfig,\n ...token,\n },\n },\n };\n\n return await this.signAndSubmitPremint({\n walletClient,\n account,\n checkSignature: false,\n verifyingContract: collection,\n publicClient: this.getPublicClient(),\n uid: uid,\n collection: {\n ...signerData.collection,\n contractAdmin: signerData.collection.contractAdmin as Address,\n },\n premintConfig: signerData.premint,\n });\n }\n\n /**\n * Delete premint.\n *\n * 1. Loads current premint from collection address with UID\n * 2. Increments version and marks as deleted\n * 3. Signs new premint version\n * 4. Sends to ZORA Premint API\n *\n * Deletes existing premint\n * @param settings.collection collection address\n * @param settings.uid UID\n * @param settings.walletClient viem wallet client to use to sign\n *\n */\n async deletePremint({\n walletClient,\n uid,\n account,\n collection,\n publicClient,\n }: {\n walletClient: WalletClient;\n publicClient: PublicClient;\n uid: number;\n account?: Account | Address;\n collection: Address;\n }) {\n const signatureResponse = await this.apiClient.getSignature({\n chain_name: this.network.zoraBackendChainName,\n collection_address: collection.toLowerCase(),\n uid: uid,\n });\n\n const signerData = {\n ...signatureResponse,\n collection: convertCollection(signatureResponse.collection),\n premint: {\n ...convertPremint(signatureResponse.premint),\n deleted: true,\n },\n };\n\n return await this.signAndSubmitPremint({\n walletClient,\n account,\n checkSignature: false,\n verifyingContract: collection,\n publicClient: this.getPublicClient(publicClient),\n uid: uid,\n collection: signerData.collection,\n premintConfig: signerData.premint,\n });\n }\n\n /**\n * Internal function to sign and submit a premint request.\n *\n * @param premintArguments Arguments to premint\n * @returns\n */\n private async signAndSubmitPremint({\n walletClient,\n publicClient,\n verifyingContract,\n premintConfig,\n uid,\n account,\n checkSignature,\n collection,\n }: {\n publicClient: PublicClient;\n uid: number;\n walletClient: WalletClient;\n verifyingContract: Address;\n checkSignature: boolean;\n account?: Address | Account;\n premintConfig: PremintConfig;\n collection: PremintSignatureGetResponse[\"collection\"];\n }) {\n if (!account) {\n account = walletClient.account;\n }\n if (!account) {\n throw new Error(\"No account provided\");\n }\n\n const signature = await walletClient.signTypedData({\n account,\n ...preminterTypedDataDefinition({\n verifyingContract,\n premintConfig,\n chainId: this.chain.id,\n }),\n });\n\n if (checkSignature) {\n const [isValidSignature] = await publicClient.readContract({\n abi: zoraCreator1155PremintExecutorImplABI,\n address: this.getExecutorAddress(),\n functionName: \"isValidSignature\",\n args: [convertCollection(collection), premintConfig, signature],\n });\n if (!isValidSignature) {\n throw new Error(\"Invalid signature\");\n }\n }\n\n const apiData = {\n collection,\n premint: encodePremintForAPI(premintConfig),\n chain_name: this.network.zoraBackendChainName,\n signature: signature,\n };\n\n const premint = await this.apiClient.postSignature(apiData);\n\n return {\n urls: this.makeUrls({ address: verifyingContract, uid }),\n uid,\n verifyingContract,\n premint,\n };\n }\n\n /**\n * Create premint\n *\n * @param settings Settings for the new premint\n * @param settings.account Account to sign the premint with. Taken from walletClient if none passed in.\n * @param settings.collection Collection information for the mint\n * @param settings.token Mint argument settings, optional settings are overridden with sensible defaults.\n * @param settings.publicClient Public client (optional) – instantiated if not passed in with defaults.\n * @param settings.walletClient Required wallet client for signing the premint message.\n * @param settings.executionSettings Execution settings for premint options\n * @param settings.executionSettings.deleted If this UID should be deleted. If omitted, set to false.\n * @param settings.executionSettings.uid the UID to use – optional and retrieved as a fresh UID from ZORA by default.\n * @param settings.checkSignature if the signature should have a pre-flight check. Not required but helpful for debugging.\n * @returns premint url, uid, newContractAddress, and premint object\n */\n async createPremint({\n account,\n collection,\n token,\n publicClient,\n walletClient,\n executionSettings,\n checkSignature = false,\n }: {\n account: Address;\n checkSignature?: boolean;\n walletClient: WalletClient;\n collection: PremintSignatureGetResponse[\"collection\"];\n token: MintArgumentsSettings;\n publicClient?: PublicClient;\n executionSettings?: {\n deleted?: boolean;\n uid?: number;\n };\n }) {\n publicClient = this.getPublicClient(publicClient);\n\n const newContractAddress = await publicClient.readContract({\n address: this.getExecutorAddress(),\n abi: zoraCreator1155PremintExecutorImplABI,\n functionName: \"getContractAddress\",\n args: [convertCollection(collection)],\n });\n\n const tokenConfig = {\n ...DefaultMintArguments,\n fixedPriceMinter: this.getFixedPriceMinterAddress(),\n royaltyRecipient: account,\n ...token,\n };\n\n let uid = executionSettings?.uid;\n if (!uid) {\n const uidResponse = await this.apiClient.getNextUID({\n chain_name: this.network.zoraBackendChainName,\n collection_address: newContractAddress.toLowerCase(),\n });\n uid = uidResponse.next_uid;\n }\n\n if (!uid) {\n throw new Error(\"UID is missing but required\");\n }\n\n let deleted = executionSettings?.deleted || false;\n\n const premintConfig = {\n tokenConfig: tokenConfig,\n uid,\n version: 1,\n deleted,\n };\n\n return await this.signAndSubmitPremint({\n uid,\n verifyingContract: newContractAddress,\n premintConfig,\n checkSignature,\n account,\n publicClient,\n walletClient,\n collection,\n });\n }\n\n /**\n * Fetches given premint data from the ZORA API.\n *\n * @param address Address for the premint contract\n * @param uid UID for the desired premint\n * @returns PremintSignatureGetResponse of premint data from the API\n */\n async getPremintData({\n address,\n uid,\n }: {\n address: string;\n uid: number;\n }): Promise<PremintSignatureGetResponse> {\n return await this.apiClient.getSignature({\n chain_name: this.network.zoraBackendChainName,\n collection_address: address,\n uid,\n });\n }\n\n /**\n * Check user signature for v1\n *\n * @param data Signature data from the API\n * @returns isValid = signature is valid or not, contractAddress = assumed contract address, recoveredSigner = signer from contract\n */\n async isValidSignature({\n data,\n publicClient,\n }: {\n data: PremintSignatureGetResponse;\n publicClient?: PublicClient;\n }): Promise<{\n isValid: boolean;\n contractAddress: Address;\n recoveredSigner: Address;\n }> {\n publicClient = this.getPublicClient(publicClient);\n\n const [isValid, contractAddress, recoveredSigner] =\n await publicClient.readContract({\n abi: zoraCreator1155PremintExecutorImplABI,\n address: this.getExecutorAddress(),\n functionName: \"isValidSignature\",\n args: [\n convertCollection(data.collection),\n convertPremint(data.premint),\n data.signature as Hex,\n ],\n });\n\n return { isValid, contractAddress, recoveredSigner };\n }\n\n protected makeUrls({\n uid,\n address,\n tokenId,\n }: {\n uid?: number;\n tokenId?: bigint;\n address?: Address;\n }): URLSReturnType {\n if ((!uid || !tokenId) && !address) {\n return { explorer: null, zoraCollect: null, zoraManage: null };\n }\n\n const zoraTokenPath = uid ? `premint-${uid}` : tokenId;\n\n return {\n explorer: tokenId\n ? `https://${this.chain.blockExplorers?.default.url}/token/${address}/instance/${tokenId}`\n : null,\n zoraCollect: `https://${\n this.network.isTestnet ? \"testnet.\" : \"\"\n }zora.co/collect/${\n this.network.zoraPathChainName\n }:${address}/${zoraTokenPath}`,\n zoraManage: `https://${\n this.network.isTestnet ? \"testnet.\" : \"\"\n }zora.co/collect/${\n this.network.zoraPathChainName\n }:${address}/${zoraTokenPath}`,\n };\n }\n\n /**\n * Execute premint on-chain\n *\n * @param settings.data Data from the API for the mint\n * @param settings.account Optional account (if omitted taken from wallet client) for the account executing the premint.\n * @param settings.walletClient WalletClient to send execution from.\n * @param settings.mintArguments User minting arguments.\n * @param settings.mintArguments.quantityToMint Quantity to mint, optional, defaults to 1.\n * @param settings.mintArguments.mintComment Optional mint comment, optional, omits when not included.\n * @param settings.publicClient Optional public client for preflight checks.\n * @returns receipt, log, zoraURL\n */\n async executePremint({\n data,\n account,\n mintArguments,\n }: {\n data: PremintSignatureGetResponse;\n account: Account | Address;\n mintArguments?: {\n quantityToMint: number;\n mintComment?: string;\n };\n }): Promise<{request: SimulateContractParameters}> {\n if (mintArguments && mintArguments?.quantityToMint < 1) {\n throw new Error(\"Quantity to mint cannot be below 1\");\n }\n\n const targetAddress = this.getExecutorAddress();\n const numberToMint = BigInt(mintArguments?.quantityToMint || 1);\n const args = [\n convertCollection(data.collection),\n convertPremint(data.premint),\n data.signature as Hex,\n numberToMint,\n mintArguments?.mintComment || \"\",\n ] as const;\n\n if (!account) {\n throw new Error(\"Wallet not passed in\");\n }\n\n const value = numberToMint * REWARD_PER_TOKEN;\n\n const request = {\n account,\n abi: zoraCreator1155PremintExecutorImplABI,\n functionName: \"premint\",\n value,\n address: targetAddress,\n args,\n };\n\n return {\n request,\n };\n }\n}\n\nexport function createPremintClient({\n chain,\n premintAPIClient,\n}: {\n chain: Chain;\n premintAPIClient?: typeof PremintAPIClient;\n}) {\n return new PremintClient(chain, premintAPIClient);\n}\n","import { Address } from \"abitype\";\nimport { ExtractAbiFunction, AbiParametersToPrimitiveTypes } from \"abitype\";\nimport { zoraCreator1155PremintExecutorImplABI as preminterAbi } from \"@zoralabs/protocol-deployments\";\nimport { TypedDataDefinition } from \"viem\";\n\ntype PremintInputs = ExtractAbiFunction<\n typeof preminterAbi,\n \"premint\"\n>[\"inputs\"];\n\ntype PreminterHashDataTypes = AbiParametersToPrimitiveTypes<PremintInputs>;\n\nexport type ContractCreationConfig = PreminterHashDataTypes[0];\nexport type PremintConfig = PreminterHashDataTypes[1];\nexport type TokenCreationConfig = PremintConfig[\"tokenConfig\"];\n\n// Convenience method to create the structured typed data\n// needed to sign for a premint contract and token\nexport const preminterTypedDataDefinition = ({\n verifyingContract,\n premintConfig,\n chainId,\n}: {\n verifyingContract: Address;\n premintConfig: PremintConfig;\n chainId: number;\n}) => {\n const { tokenConfig, uid, version, deleted } = premintConfig;\n const types = {\n CreatorAttribution: [\n { name: \"tokenConfig\", type: \"TokenCreationConfig\" },\n // unique id scoped to the contract and token to create.\n // ensure that a signature can be replaced, as long as the replacement\n // has the same uid, and a newer version.\n { name: \"uid\", type: \"uint32\" },\n { name: \"version\", type: \"uint32\" },\n // if this update should result in the signature being deleted.\n { name: \"deleted\", type: \"bool\" },\n ],\n TokenCreationConfig: [\n { name: \"tokenURI\", type: \"string\" },\n { name: \"maxSupply\", type: \"uint256\" },\n { name: \"maxTokensPerAddress\", type: \"uint64\" },\n { name: \"pricePerToken\", type: \"uint96\" },\n { name: \"mintStart\", type: \"uint64\" },\n { name: \"mintDuration\", type: \"uint64\" },\n { name: \"royaltyMintSchedule\", type: \"uint32\" },\n { name: \"royaltyBPS\", type: \"uint32\" },\n { name: \"royaltyRecipient\", type: \"address\" },\n { name: \"fixedPriceMinter\", type: \"address\" },\n ],\n };\n\n const result: TypedDataDefinition<typeof types, \"CreatorAttribution\"> = {\n domain: {\n chainId,\n name: \"Preminter\",\n version: \"1\",\n verifyingContract: verifyingContract,\n },\n types,\n message: {\n tokenConfig,\n uid,\n version,\n deleted,\n },\n primaryType: \"CreatorAttribution\",\n };\n\n return result;\n};\n","export class BadResponseError<T = any> extends Error {\n status: number;\n json: T;\n constructor(message: string, status: number, json: any) {\n super(message);\n this.name = \"BadResponseError\";\n this.status = status;\n this.json = json;\n }\n}\n\nasync function wait(delayMs: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, delayMs);\n });\n}\n\n/**\n * A simple fetch() wrapper for HTTP gets.\n * Can be overridden as needed.\n *\n * @param path Path to run HTTP JSON get against\n * @returns JSON object response\n * @throws Error when HTTP response fails\n */\nexport const get = async <T>(url: string) => {\n const response = await fetch(url, { method: \"GET\" });\n if (response.status !== 200) {\n let json;\n try {\n json = await response.json();\n } catch (e: any) {}\n throw new BadResponseError(\n `Invalid response, status ${response.status}`,\n response.status,\n json,\n );\n }\n return (await response.json()) as T;\n};\n\n/**\n * A simple fetch() wrapper for HTTP post.\n * Can be overridden as needed.\n *\n * @param path Path to run HTTP JSON POST against\n * @param data Data to POST to the server, converted to JSON\n * @returns JSON object response\n * @throws Error when HTTP response fails\n */\nexport const post = async <T>(url: string, data: any) => {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n },\n body: JSON.stringify(data),\n });\n if (response.status !== 200) {\n let json;\n try {\n json = await response.json();\n } catch (e: any) {}\n throw new BadResponseError(\n `Bad response: ${response.status}`,\n response.status,\n json,\n );\n }\n return (await response.json()) as T;\n};\n\nexport const retries = async <T>(\n tryFn: () => T,\n maxTries: number = 3,\n atTry: number = 1,\n linearBackoffMS: number = 200,\n): Promise<T> => {\n try {\n return await tryFn();\n } catch (err: any) {\n if (err instanceof BadResponseError) {\n if (err.status >= 500) {\n if (atTry <= maxTries) {\n await wait(atTry * linearBackoffMS);\n return await retries(tryFn, maxTries, atTry + 1);\n }\n }\n }\n throw err;\n }\n};\n","export const ZORA_API_BASE = \"https://api.zora.co/\";\nexport const OPEN_EDITION_MINT_SIZE = BigInt(\"18446744073709551615\");\n\n// Subgraph base settings\nconst SUBGRAPH_CONFIG_BASE =\n \"https://api.goldsky.com/api/public/project_clhk16b61ay9t49vm6ntn4mkz/subgraphs\";\n\nexport function getSubgraph(name: string, version: string): string {\n return `${SUBGRAPH_CONFIG_BASE}/${name}/${version}/gn`;\n}\n","import { post, retries, get } from \"../apis/http-api-base\";\nimport { components, paths } from \"../apis/generated/premint-api-types\";\nimport { ZORA_API_BASE } from \"../constants\";\n\ntype SignaturePostType = paths[\"/signature\"][\"post\"];\ntype PremintSignatureRequestBody =\n SignaturePostType[\"requestBody\"][\"content\"][\"application/json\"];\nexport type PremintSignatureResponse =\n SignaturePostType[\"responses\"][200][\"content\"][\"application/json\"];\n\ntype PremintNextUIDGetType =\n paths[\"/signature/{chain_name}/{collection_address}/next_uid\"][\"get\"];\ntype PremintNextUIDGetPathParameters =\n PremintNextUIDGetType[\"parameters\"][\"path\"];\nexport type PremintNextUIDGetResponse =\n PremintNextUIDGetType[\"responses\"][200][\"content\"][\"application/json\"];\n\ntype SignaturePremintGetType =\n paths[\"/signature/{chain_name}/{collection_address}/{uid}\"][\"get\"];\ntype PremintSignatureGetPathParameters =\n SignaturePremintGetType[\"parameters\"][\"path\"];\nexport type PremintSignatureGetResponse =\n SignaturePremintGetType[\"responses\"][200][\"content\"][\"application/json\"];\n\nexport type BackendChainNames = components[\"schemas\"][\"ChainName\"];\n\nconst postSignature = async (\n data: PremintSignatureRequestBody,\n): Promise<PremintSignatureResponse> =>\n retries(() =>\n post<PremintSignatureResponse>(`${ZORA_API_BASE}premint/signature`, data),\n );\n\nconst getNextUID = async (\n path: PremintNextUIDGetPathParameters,\n): Promise<PremintNextUIDGetResponse> =>\n retries(() =>\n get<PremintNextUIDGetResponse>(\n `${ZORA_API_BASE}premint/signature/${path.chain_name}/${path.collection_address}/next_uid`,\n ),\n );\n\nconst getSignature = async (\n path: PremintSignatureGetPathParameters,\n): Promise<PremintSignatureGetResponse> =>\n retries(() =>\n get<PremintSignatureGetResponse>(\n `${ZORA_API_BASE}premint/signature/${path.chain_name}/${path.collection_address}/${path.uid}`,\n ),\n );\n\nexport const PremintAPIClient = {\n postSignature,\n getSignature,\n getNextUID,\n};\nexport { ZORA_API_BASE };\n","import { Chain, PublicClient, createPublicClient, http } from \"viem\";\nimport { NetworkConfig, networkConfigByChain } from \"./chain-constants\";\n\nexport abstract class ClientBase {\n network: NetworkConfig;\n chain: Chain;\n\n constructor(chain: Chain) {\n this.chain = chain;\n const networkConfig = networkConfigByChain[chain.id];\n if (!networkConfig) {\n throw new Error(`Not configured for chain ${chain.id}`);\n }\n this.network = networkConfig;\n }\n\n /**\n * Getter for public client that instantiates a publicClient as needed\n *\n * @param publicClient Optional viem public client\n * @returns Existing public client or makes a new one for the given chain as needed.\n */\n protected getPublicClient(publicClient?: PublicClient): PublicClient {\n if (publicClient) {\n return publicClient;\n }\n return createPublicClient({ chain: this.chain, transport: http() });\n }\n}\n","import {\n base,\n baseGoerli,\n foundry,\n goerli,\n mainnet,\n optimism,\n optimismGoerli,\n zora,\n zoraTestnet,\n} from \"viem/chains\";\nimport type { components } from \"./generated/premint-api-types\";\nimport { parseEther } from \"viem\";\nimport { getSubgraph } from \"../constants\";\n\nexport type NetworkConfig = {\n chainId: number;\n zoraPathChainName: string;\n zoraBackendChainName: components[\"schemas\"][\"ChainName\"];\n isTestnet: boolean;\n subgraphUrl: string;\n};\n\nexport const REWARD_PER_TOKEN = parseEther(\"0.000777\");\n\nexport const BackendChainNamesLookup = {\n ZORA_MAINNET: \"ZORA-MAINNET\",\n ZORA_GOERLI: \"ZORA-GOERLI\",\n OPTIMISM_MAINNET: \"OPTIMISM-MAINNET\",\n OPTIMISM_GOERLI: \"OPTIMISM-GOERLI\",\n ETHEREUM_MAINNET: \"ETHEREUM-MAINNET\",\n ETHEREUM_GOERLI: \"ETHEREUM-GOERLI\",\n BASE_MAINNET: \"BASE-MAINNET\",\n BASE_GOERLI: \"BASE-GOERLI\",\n} as const;\n\nexport const networkConfigByChain: Record<number, NetworkConfig> = {\n [mainnet.id]: {\n chainId: mainnet.id,\n isTestnet: false,\n zoraPathChainName: \"eth\",\n zoraBackendChainName: BackendChainNamesLookup.ETHEREUM_MAINNET,\n subgraphUrl: getSubgraph(\"zora-create-mainnet\", \"stable\"),\n },\n [goerli.id]: {\n chainId: goerli.id,\n isTestnet: true,\n zoraPathChainName: \"gor\",\n zoraBackendChainName: BackendChainNamesLookup.ETHEREUM_GOERLI,\n subgraphUrl: getSubgraph(\"zora-create-goerli\", \"stable\"),\n },\n [zora.id]: {\n chainId: zora.id,\n isTestnet: false,\n zoraPathChainName: \"zora\",\n zoraBackendChainName: BackendChainNamesLookup.ZORA_MAINNET,\n subgraphUrl: getSubgraph(\"zora-create-zora-mainnet\", \"stable\"),\n },\n [zoraTestnet.id]: {\n chainId: zora.id,\n isTestnet: true,\n zoraPathChainName: \"zgor\",\n zoraBackendChainName: BackendChainNamesLookup.ZORA_GOERLI,\n subgraphUrl: getSubgraph(\"zora-create-zora-testnet\", \"stable\"),\n },\n [optimism.id]: {\n chainId: optimism.id,\n isTestnet: false,\n zoraPathChainName: \"opt\",\n zoraBackendChainName: BackendChainNamesLookup.OPTIMISM_MAINNET,\n subgraphUrl: getSubgraph(\"zora-create-optimism\", \"stable\"),\n },\n [optimismGoerli.id]: {\n chainId: optimismGoerli.id,\n isTestnet: true,\n zoraPathChainName: \"ogor\",\n zoraBackendChainName: BackendChainNamesLookup.OPTIMISM_GOERLI,\n subgraphUrl: getSubgraph(\"zora-create-optimism-goerli\", \"stable\"),\n },\n [base.id]: {\n chainId: base.id,\n isTestnet: false,\n zoraPathChainName: \"base\",\n zoraBackendChainName: BackendChainNamesLookup.BASE_MAINNET,\n subgraphUrl: getSubgraph(\"zora-create-base-mainnet\", \"stable\"),\n },\n [baseGoerli.id]: {\n chainId: baseGoerli.id,\n isTestnet: true,\n zoraPathChainName: \"bgor\",\n zoraBackendChainName: BackendChainNamesLookup.BASE_GOERLI,\n subgraphUrl: getSubgraph(\"zora-create-base-goerli\", \"stable\"),\n },\n [foundry.id]: {\n chainId: foundry.id,\n isTestnet: true,\n zoraPathChainName: \"zgor\",\n zoraBackendChainName: BackendChainNamesLookup.ZORA_GOERLI,\n subgraphUrl: getSubgraph(\"zora-create-zora-testnet\", \"stable\"),\n },\n};\n","import { retries, get, post } from \"../apis/http-api-base\";\nimport { paths } from \"../apis/generated/discover-api-types\";\nimport { ZORA_API_BASE } from \"../constants\";\n\nexport type MintableGetToken =\n paths[\"/mintables/{chain_name}/{collection_address}\"];\ntype MintableGetTokenPathParameters =\n MintableGetToken[\"get\"][\"parameters\"][\"path\"];\ntype MintableGetTokenGetQueryParameters =\n MintableGetToken[\"get\"][\"parameters\"][\"query\"];\nexport type MintableGetTokenResponse =\n MintableGetToken[\"get\"][\"responses\"][200][\"content\"][\"application/json\"];\n\nfunction encodeQueryParameters(params: Record<string, string>) {\n return new URLSearchParams(params).toString();\n}\n\nconst getMintable = async (\n path: MintableGetTokenPathParameters,\n query: MintableGetTokenGetQueryParameters,\n): Promise<MintableGetTokenResponse> =>\n retries(() => {\n return get<MintableGetTokenResponse>(\n `${ZORA_API_BASE}discover/mintables/${path.chain_name}/${\n path.collection_address\n }${query?.token_id ? `?${encodeQueryParameters(query)}` : \"\"}`,\n );\n });\n\nexport const getSalesConfigFixedPrice = async ({\n contractAddress,\n tokenId,\n subgraphUrl,\n}: {\n contractAddress: string;\n tokenId: string;\n subgraphUrl: string;\n}): Promise<undefined | string> =>\n retries(async () => {\n const response = await post<any>(subgraphUrl, {\n query:\n \"query($id: ID!) {\\n zoraCreateToken(id: $id) {\\n id\\n salesStrategies{\\n fixedPrice {\\n address\\n }\\n }\\n }\\n}\",\n variables: { id: `${contractAddress.toLowerCase()}-${tokenId}` },\n });\n return response.zoraCreateToken?.salesStrategies?.find(() => true)\n ?.fixedPriceMinterAddress;\n });\n\nexport const MintAPIClient = {\n getMintable,\n getSalesConfigFixedPrice,\n};\n","import {\n zoraCreator1155FactoryImplABI,\n zoraCreator1155FactoryImplAddress,\n zoraCreator1155ImplABI,\n zoraCreatorFixedPriceSaleStrategyABI,\n} from \"@zoralabs/protocol-deployments\";\nimport type {\n Address,\n Hex,\n PublicClient,\n SimulateContractParameters,\n TransactionReceipt,\n} from \"viem\";\nimport { decodeEventLog, encodeFunctionData, zeroAddress } from \"viem\";\nimport { OPEN_EDITION_MINT_SIZE } from \"../constants\";\n\n// Sales end forever amount (uint64 max)\nconst SALE_END_FOREVER = 18446744073709551615n;\n\n// Default royalty bps\nconst ROYALTY_BPS_DEFAULT = 1000;\n\ntype SalesConfigParamsType = {\n // defaults to 0\n pricePerToken?: bigint;\n // defaults to 0, in seconds\n saleStart?: bigint;\n // defaults to forever, in seconds\n saleEnd?: bigint;\n // max tokens that can be minted per address\n maxTokensPerAddress?: bigint;\n fundsRecipient?: Address;\n};\n\nexport const DEFAULT_SALE_SETTINGS = {\n fundsRecipient: zeroAddress,\n // Free Mint\n pricePerToken: 0n,\n // Sale start time – defaults to beginning of unix time\n saleStart: 0n,\n // This is the end of uint64, plenty of time\n saleEnd: SALE_END_FOREVER,\n // 0 Here means no limit\n maxTokensPerAddress: 0n,\n};\n\n// Hardcode the permission bit for the minter\nconst PERMISSION_BIT_MINTER = 2n ** 2n;\n\ntype ContractType =\n | {\n name: string;\n uri: string;\n defaultAdmin?: Address;\n }\n | Address;\n\ntype RoyaltySettingsType = {\n royaltyBPS: number;\n royaltyRecipient: Address;\n};\n\nexport function create1155TokenSetupArgs({\n nextTokenId,\n // How many NFTs upon initialization to mint to the creator\n mintToCreatorCount,\n tokenMetadataURI,\n // Fixed price minter address – required minter\n fixedPriceMinterAddress,\n // Address to use as the create referral, optional.\n createReferral,\n // Optional max supply of the token. Default unlimited\n maxSupply,\n // wallet sending the transaction\n account,\n salesConfig,\n royaltySettings,\n}: {\n maxSupply?: bigint | number;\n createReferral?: Address;\n nextTokenId: bigint;\n mintToCreatorCount: bigint | number;\n // wallet sending the transaction\n account: Address;\n tokenMetadataURI: string;\n fixedPriceMinterAddress: Address;\n salesConfig: SalesConfigParamsType;\n royaltySettings?: RoyaltySettingsType;\n}) {\n if (!maxSupply) {\n maxSupply = OPEN_EDITION_MINT_SIZE;\n }\n maxSupply = BigInt(maxSupply);\n mintToCreatorCount = BigInt(mintToCreatorCount);\n\n const salesConfigWithDefaults = {\n // Set static sales default.\n ...DEFAULT_SALE_SETTINGS,\n // Override with user settings.\n ...salesConfig,\n };\n\n const setupActions = [\n encodeFunctionData({\n abi: zoraCreator1155ImplABI,\n functionName: \"assumeLastTokenIdMatches\",\n args: [nextTokenId - 1n],\n }),\n createReferral\n ? encodeFunctionData({\n abi: zoraCreator1155ImplABI,\n functionName: \"setupNewTokenWithCreateReferral\",\n args: [tokenMetadataURI, maxSupply, createReferral],\n })\n : encodeFunctionData({\n abi: zoraCreator1155ImplABI,\n functionName: \"setupNewToken\",\n args: [tokenMetadataURI, maxSupply],\n }),\n encodeFunctionData({\n abi: zoraCreator1155ImplABI,\n functionName: \"addPermission\",\n args: [0n, fixedPriceMinterAddress, PERMISSION_BIT_MINTER],\n }),\n encodeFunctionData({\n abi: zoraCreator1155ImplABI,\n functionName: \"callSale\",\n args: [\n nextTokenId,\n fixedPriceMinterAddress,\n encodeFunctionData({\n abi: zoraCreatorFixedPriceSaleStrategyABI,\n functionName: \"setSale\",\n args: [nextTokenId, salesConfigWithDefaults],\n }),\n ],\n }),\n ];\n\n if (mintToCreatorCount) {\n setupActions.push(\n encodeFunctionData({\n abi: zoraCreator1155ImplABI,\n functionName: \"adminMint\",\n args: [account, nextTokenId, mintToCreatorCount, \"0x\"],\n }),\n );\n }\n\n if (royaltySettings) {\n setupActions.push(\n encodeFunctionData({\n abi: zoraCreator1155ImplABI,\n functionName: \"updateRoyaltiesForToken\",\n args: [\n nextTokenId,\n {\n royaltyMintSchedule: 0,\n royaltyBPS: royaltySettings?.royaltyBPS || ROYALTY_BPS_DEFAULT,\n royaltyRecipient: royaltySettings?.royaltyRecipient || account,\n },\n ],\n }),\n );\n }\n\n return setupActions;\n}\n\nexport const getTokenIdFromCreateReceipt = (\n receipt: TransactionReceipt,\n): bigint | undefined => {\n for (const data of receipt.logs) {\n try {\n const decodedLog = decodeEventLog({\n abi: zoraCreator1155ImplABI,\n eventName: \"SetupNewToken\",\n ...data,\n });\n if (decodedLog && decodedLog.eventName === \"SetupNewToken\") {\n return decodedLog.args.tokenId;\n }\n } catch (err: any) {}\n }\n};\n\nasync function getContractExists(\n publicClient: PublicClient,\n contract: ContractType,\n // Account that is the creator of the contract\n account: Address,\n) {\n let contractAddress;\n let contractExists = false;\n if (typeof contract !== \"string\") {\n contractAddress = await publicClient.readContract({\n abi: zoraCreator1155FactoryImplABI,\n // Since this address is deterministic we can hardcode a chain id safely here.\n address: zoraCreator1155FactoryImplAddress[999],\n functionName: \"deterministicContractAddress\",\n args: [\n account,\n contract.uri,\n contract.name,\n contract.defaultAdmin || account,\n ],\n });\n\n try {\n await publicClient.readContract({\n abi: zoraCreator1155ImplABI,\n address: contractAddress,\n functionName: \"contractVersion\",\n });\n contractExists = true;\n } catch (e: any) {\n // This logic branch is hit if the contract doesn't exist\n // falling back to contractExists to false.\n }\n return { contractAddress, contractExists };\n }\n\n return {\n contractExists: true,\n contractAddress: contract,\n };\n}\n\ntype CreateNew1155TokenReturn = {\n request: SimulateContractParameters;\n tokenSetupActions: Hex[];\n contractAddress: Address;\n contractExists: boolean;\n};\n\nexport function create1155CreatorClient({\n publicClient,\n}: {\n publicClient: PublicClient;\n}) {\n async function createNew1155Token({\n contract,\n tokenMetadataURI,\n mintToCreatorCount = 1,\n salesConfig = {},\n maxSupply,\n account,\n royaltySettings,\n getAdditionalSetupActions,\n }: {\n account: Address;\n maxSupply?: bigint | number;\n royaltySettings?: RoyaltySettingsType;\n royaltyBPS?: number;\n contract: ContractType;\n tokenMetadataURI: string;\n mintToCreatorCount?: bigint | number;\n salesConfig?: SalesConfigParamsType;\n getAdditionalSetupActions?: (args: {\n tokenId: bigint;\n contractAddress: Address;\n }) => Hex[];\n }): Promise<CreateNew1155TokenReturn> {\n // Check if contract exists either from metadata or the static address passed in.\n // If a static address is passed in, this fails if that contract does not exist.\n const { contractExists, contractAddress } = await getContractExists(\n publicClient,\n contract,\n account,\n );\n\n // Assume the next token id is the first token available for a new contract.\n let nextTokenId = 1n;\n\n if (contractExists) {\n nextTokenId = await publicClient.readContract({\n abi: zoraCreator1155ImplABI,\n functionName: \"nextTokenId\",\n address: contractAddress,\n });\n }\n\n // Get the fixed price minter to use within the new token to set the sales configuration.\n const fixedPriceMinterAddress = await publicClient.readContract({\n abi: zoraCreator1155FactoryImplABI,\n address: zoraCreator1155FactoryImplAddress[999],\n functionName: \"fixedPriceMinter\",\n });\n\n let tokenSetupActions = create1155TokenSetupArgs({\n tokenMetadataURI,\n nextTokenId,\n salesConfig,\n maxSupply,\n fixedPriceMinterAddress,\n account,\n mintToCreatorCount,\n royaltySettings,\n });\n if (getAdditionalSetupActions) {\n tokenSetupActions = [\n ...getAdditionalSetupActions({ tokenId: nextTokenId, contractAddress }),\n ...tokenSetupActions,\n ];\n }\n\n if (!contractAddress && typeof contract === \"string\") {\n throw new Error(\"Invariant: contract cannot be missing and an address\");\n }\n if (!contractExists && typeof contract !== \"string\") {\n const request: SimulateContractParameters<\n typeof zoraCreator1155FactoryImplABI,\n \"createContractDeterministic\"\n > = {\n abi: zoraCreator1155FactoryImplABI,\n functionName: \"createContractDeterministic\",\n account,\n address: zoraCreator1155FactoryImplAddress[999],\n args: [\n contract.uri,\n contract.name,\n {\n // deprecated\n royaltyMintSchedule: 0,\n royaltyBPS: royaltySettings?.royaltyBPS || ROYALTY_BPS_DEFAULT,\n royaltyRecipient: royaltySettings?.royaltyRecipient || account,\n },\n contract.defaultAdmin || account,\n tokenSetupActions,\n ],\n };\n return {\n request,\n tokenSetupActions,\n contractAddress,\n contractExists,\n };\n } else if (contractExists) {\n const request: SimulateContractParameters<\n typeof zoraCreator1155ImplABI,\n \"multicall\"\n > = {\n abi: zoraCreator1155ImplABI,\n functionName: \"multicall\",\n account,\n address: contractAddress,\n args: [tokenSetupActions],\n };\n return {\n request,\n tokenSetupActions,\n contractAddress,\n contractExists,\n };\n }\n throw new Error(\"Unsupported contract argument type\");\n }\n return { createNew1155Token };\n}\n"],"mappings":"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","names":["import_viem","import_viem","import_protocol_deployments","import_viem"]}
package/dist/index.js CHANGED
@@ -355,6 +355,16 @@ var PremintClient = class extends ClientBase {
355
355
  getFixedPriceMinterAddress() {
356
356
  return zoraCreatorFixedPriceSaleStrategyAddress[999];
357
357
  }
358
+ getDataFromPremintReceipt(receipt) {
359
+ const premintedLog = getPremintedLogFromReceipt(receipt);
360
+ return {
361
+ premintedLog,
362
+ urls: this.makeUrls({
363
+ address: premintedLog?.contractAddress,
364
+ tokenId: premintedLog?.tokenId
365
+ })
366
+ };
367
+ }
358
368
  /**
359
369
  * Update existing premint given collection address and UID of existing premint.
360
370
  *
@@ -643,14 +653,11 @@ var PremintClient = class extends ClientBase {
643
653
  * @param settings.publicClient Optional public client for preflight checks.
644
654
  * @returns receipt, log, zoraURL
645
655
  */
646
- async executePremintWithWallet({
656
+ async executePremint({
647
657
  data,
648
658
  account,
649
- walletClient,
650
- mintArguments,
651
- publicClient
659
+ mintArguments
652
660
  }) {
653
- publicClient = this.getPublicClient(publicClient);
654
661
  if (mintArguments && mintArguments?.quantityToMint < 1) {
655
662
  throw new Error("Quantity to mint cannot be below 1");
656
663
  }
@@ -663,34 +670,29 @@ var PremintClient = class extends ClientBase {
663
670
  numberToMint,
664
671
  mintArguments?.mintComment || ""
665
672
  ];
666
- if (!account) {
667
- account = walletClient.account;
668
- }
669
673
  if (!account) {
670
674
  throw new Error("Wallet not passed in");
671
675
  }
672
676
  const value = numberToMint * REWARD_PER_TOKEN;
673
- const { request } = await publicClient.simulateContract({
677
+ const request = {
674
678
  account,
675
679
  abi: zoraCreator1155PremintExecutorImplABI,
676
680
  functionName: "premint",
677
681
  value,
678
682
  address: targetAddress,
679
683
  args
680
- });
681
- const hash = await walletClient.writeContract(request);
682
- const receipt = await publicClient.waitForTransactionReceipt({ hash });
683
- const premintedLog = getPremintedLogFromReceipt(receipt);
684
+ };
684
685
  return {
685
- receipt,
686
- premintedLog,
687
- urls: this.makeUrls({
688
- address: premintedLog?.contractAddress,
689
- tokenId: premintedLog?.tokenId
690
- })
686
+ request
691
687
  };
692
688
  }
693
689
  };
690
+ function createPremintClient({
691
+ chain,
692
+ premintAPIClient
693
+ }) {
694
+ return new PremintClient(chain, premintAPIClient);
695
+ }
694
696
 
695
697
  // src/mint/mint-api-client.ts
696
698
  function encodeQueryParameters(params) {
@@ -767,11 +769,6 @@ function create1155TokenSetupArgs({
767
769
  ...salesConfig
768
770
  };
769
771
  const setupActions = [
770
- encodeFunctionData({
771
- abi: zoraCreator1155ImplABI,
772
- functionName: "addPermission",
773
- args: [0n, fixedPriceMinterAddress, PERMISSION_BIT_MINTER]
774
- }),
775
772
  encodeFunctionData({
776
773
  abi: zoraCreator1155ImplABI,
777
774
  functionName: "assumeLastTokenIdMatches",
@@ -786,6 +783,11 @@ function create1155TokenSetupArgs({
786
783
  functionName: "setupNewToken",
787
784
  args: [tokenMetadataURI, maxSupply]
788
785
  }),
786
+ encodeFunctionData({
787
+ abi: zoraCreator1155ImplABI,
788
+ functionName: "addPermission",
789
+ args: [0n, fixedPriceMinterAddress, PERMISSION_BIT_MINTER]
790
+ }),
789
791
  encodeFunctionData({
790
792
  abi: zoraCreator1155ImplABI,
791
793
  functionName: "callSale",
@@ -874,107 +876,111 @@ async function getContractExists(publicClient, contract, account) {
874
876
  contractAddress: contract
875
877
  };
876
878
  }
877
- async function createNew1155Token({
878
- publicClient,
879
- contract,
880
- tokenMetadataURI,
881
- mintToCreatorCount = 1,
882
- salesConfig = {},
883
- maxSupply,
884
- account,
885
- royaltySettings,
886
- getAdditionalSetupActions
879
+ function create1155CreatorClient({
880
+ publicClient
887
881
  }) {
888
- const { contractExists, contractAddress } = await getContractExists(
889
- publicClient,
882
+ async function createNew1155Token({
890
883
  contract,
891
- account
892
- );
893
- let nextTokenId = 1n;
894
- if (contractExists) {
895
- nextTokenId = await publicClient.readContract({
896
- abi: zoraCreator1155ImplABI,
897
- functionName: "nextTokenId",
898
- address: contractAddress
899
- });
900
- }
901
- const fixedPriceMinterAddress = await publicClient.readContract({
902
- abi: zoraCreator1155FactoryImplABI,
903
- address: zoraCreator1155FactoryImplAddress[999],
904
- functionName: "fixedPriceMinter"
905
- });
906
- let tokenSetupActions = create1155TokenSetupArgs({
907
884
  tokenMetadataURI,
908
- nextTokenId,
909
- salesConfig,
885
+ mintToCreatorCount = 1,
886
+ salesConfig = {},
910
887
  maxSupply,
911
- fixedPriceMinterAddress,
912
888
  account,
913
- mintToCreatorCount,
914
- royaltySettings
915
- });
916
- if (getAdditionalSetupActions) {
917
- tokenSetupActions = [
918
- ...getAdditionalSetupActions({ tokenId: nextTokenId, contractAddress }),
919
- ...tokenSetupActions
920
- ];
921
- }
922
- if (!contractAddress && typeof contract === "string") {
923
- throw new Error("Invariant: contract cannot be missing and an address");
924
- }
925
- if (!contractExists && typeof contract !== "string") {
926
- const { request } = await publicClient.simulateContract({
889
+ royaltySettings,
890
+ getAdditionalSetupActions
891
+ }) {
892
+ const { contractExists, contractAddress } = await getContractExists(
893
+ publicClient,
894
+ contract,
895
+ account
896
+ );
897
+ let nextTokenId = 1n;
898
+ if (contractExists) {
899
+ nextTokenId = await publicClient.readContract({
900
+ abi: zoraCreator1155ImplABI,
901
+ functionName: "nextTokenId",
902
+ address: contractAddress
903
+ });
904
+ }
905
+ const fixedPriceMinterAddress = await publicClient.readContract({
927
906
  abi: zoraCreator1155FactoryImplABI,
928
- functionName: "createContractDeterministic",
929
- account,
930
907
  address: zoraCreator1155FactoryImplAddress[999],
931
- args: [
932
- contract.uri,
933
- contract.name,
934
- {
935
- // deprecated
936
- royaltyMintSchedule: 0,
937
- royaltyBPS: royaltySettings?.royaltyBPS || ROYALTY_BPS_DEFAULT,
938
- royaltyRecipient: royaltySettings?.royaltyRecipient || account
939
- },
940
- contract.defaultAdmin || account,
941
- tokenSetupActions
942
- ]
908
+ functionName: "fixedPriceMinter"
943
909
  });
944
- return {
945
- send: (walletClient) => walletClient.writeContract(request),
946
- tokenSetupActions,
947
- contractAddress,
948
- contractExists
949
- };
950
- } else if (contractExists) {
951
- const { request } = await publicClient.simulateContract({
952
- abi: zoraCreator1155ImplABI,
953
- functionName: "multicall",
910
+ let tokenSetupActions = create1155TokenSetupArgs({
911
+ tokenMetadataURI,
912
+ nextTokenId,
913
+ salesConfig,
914
+ maxSupply,
915
+ fixedPriceMinterAddress,
954
916
  account,
955
- address: contractAddress,
956
- args: [tokenSetupActions]
917
+ mintToCreatorCount,
918
+ royaltySettings
957
919
  });
958
- return {
959
- send: (walletClient) => walletClient.writeContract(request),
960
- tokenSetupActions,
961
- contractAddress,
962
- contractExists
963
- };
920
+ if (getAdditionalSetupActions) {
921
+ tokenSetupActions = [
922
+ ...getAdditionalSetupActions({ tokenId: nextTokenId, contractAddress }),
923
+ ...tokenSetupActions
924
+ ];
925
+ }
926
+ if (!contractAddress && typeof contract === "string") {
927
+ throw new Error("Invariant: contract cannot be missing and an address");
928
+ }
929
+ if (!contractExists && typeof contract !== "string") {
930
+ const request = {
931
+ abi: zoraCreator1155FactoryImplABI,
932
+ functionName: "createContractDeterministic",
933
+ account,
934
+ address: zoraCreator1155FactoryImplAddress[999],
935
+ args: [
936
+ contract.uri,
937
+ contract.name,
938
+ {
939
+ // deprecated
940
+ royaltyMintSchedule: 0,
941
+ royaltyBPS: royaltySettings?.royaltyBPS || ROYALTY_BPS_DEFAULT,
942
+ royaltyRecipient: royaltySettings?.royaltyRecipient || account
943
+ },
944
+ contract.defaultAdmin || account,
945
+ tokenSetupActions
946
+ ]
947
+ };
948
+ return {
949
+ request,
950
+ tokenSetupActions,
951
+ contractAddress,
952
+ contractExists
953
+ };
954
+ } else if (contractExists) {
955
+ const request = {
956
+ abi: zoraCreator1155ImplABI,
957
+ functionName: "multicall",
958
+ account,
959
+ address: contractAddress,
960
+ args: [tokenSetupActions]
961
+ };
962
+ return {
963
+ request,
964
+ tokenSetupActions,
965
+ contractAddress,
966
+ contractExists
967
+ };
968
+ }
969
+ throw new Error("Unsupported contract argument type");
964
970
  }
965
- throw new Error("Unsupported contract argument type");
971
+ return { createNew1155Token };
966
972
  }
967
973
  export {
968
974
  DEFAULT_SALE_SETTINGS,
969
975
  DefaultMintArguments,
970
976
  MintAPIClient,
971
977
  PremintAPIClient,
972
- PremintClient,
973
978
  ZORA_API_BASE,
974
979
  convertCollection,
975
980
  convertPremint,
981
+ create1155CreatorClient,
976
982
  create1155TokenSetupArgs,
977
- createNew1155Token,
983
+ createPremintClient,
978
984
  encodePremintForAPI,
979
985
  getPremintedLogFromReceipt,
980
986
  getSalesConfigFixedPrice,