Files
js/packages/thirdweb/src/extensions/modules/MintableERC1155/mintWithSignature.ts
T
joaquim-verges 1f7bf82fe0 docs: modular contract docs (#4553)
## Problem solved

Short description of the bug fixed or feature added

<!-- start pr-codex -->

---

## PR-Codex overview
This PR updates JSDoc annotations in various files to change `@module` to `@modules` for improved clarity and consistency.

### Detailed summary
- Updated JSDoc annotations from `@module` to `@modules` in multiple files
- Added `@social` tag in `tsdoc.json`
- Updated annotations in ERC20, ERC721, and ERC1155 related modules

> The following files were skipped due to too many changes: `packages/thirdweb/src/extensions/airdrop/write/merkleInfoERC721.ts`, `packages/thirdweb/src/extensions/airdrop/write/merkleInfoERC1155.ts`, `packages/thirdweb/src/extensions/modules/common/installPublishedModule.ts`, `packages/thirdweb/src/extensions/modules/common/uninstallPublishedModule.ts`, `packages/thirdweb/src/extensions/modules/MintableERC20/mintWithSignature.ts`, `packages/thirdweb/src/extensions/modules/MintableERC721/mintWithSignature.ts`, `packages/thirdweb/src/extensions/modules/MintableERC1155/mintWithSignature.ts`, `packages/thirdweb/src/extensions/split/read/getRecipientSplitPercentage.ts`, `packages/thirdweb/src/react/core/utils/defaultTokens.ts`, `apps/portal/src/app/typescript/v5/modular/upgrade/page.mdx`, `packages/thirdweb/src/extensions/airdrop/write/airdropERC20WithSignature.ts`, `packages/thirdweb/src/extensions/airdrop/write/airdropERC721WithSignature.ts`, `packages/thirdweb/src/extensions/airdrop/write/airdropERC1155WithSignature.ts`, `packages/thirdweb/src/extensions/erc20/drops/read/getActiveClaimCondition.ts`, `packages/thirdweb/src/extensions/modules/BatchMetadataERC721/uploadMetadata.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC20/module/install.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC721/module/install.ts`, `packages/thirdweb/src/extensions/modules/__generated__/BatchMetadataERC721/module/install.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC1155/module/install.ts`, `packages/thirdweb/src/extensions/modules/ClaimableERC20/setClaimConditions.ts`, `packages/thirdweb/src/extensions/modules/__generated__/MintableERC20/module/install.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC721/module/install.ts`, `packages/thirdweb/src/extensions/modules/__generated__/BatchMetadataERC1155/module/install.ts`, `packages/thirdweb/src/extensions/modules/ClaimableERC721/setClaimConditions.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC20/module/install.ts`, `packages/thirdweb/src/extensions/modules/__generated__/MintableERC721/module/install.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC1155/module/install.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC721/module/install.ts`, `packages/thirdweb/src/extensions/modules/__generated__/MintableERC1155/module/install.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC1155/module/install.ts`, `packages/thirdweb/src/extensions/modules/__generated__/SequentialTokenIdERC1155/module/install.ts`, `packages/thirdweb/src/extensions/modules/__generated__/OpenEditionMetadataERC721/module/install.ts`, `packages/thirdweb/src/extensions/modules/ClaimableERC1155/setClaimConditions.ts`, `apps/portal/src/app/typescript/v5/modular/interact/page.mdx`, `apps/portal/src/app/typescript/v5/modular/deploy/page.mdx`, `packages/thirdweb/src/extensions/modules/BatchMetadataERC1155/uploadMetadata.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ERC721Core/read/totalMinted.ts`, `packages/thirdweb/scripts/generate/generate.ts`, `packages/thirdweb/src/extensions/modules/__generated__/MintableERC20/read/getSaleConfig.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC20/read/getSaleConfig.ts`, `packages/thirdweb/src/extensions/modules/__generated__/MintableERC721/read/getSaleConfig.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC721/read/getSaleConfig.ts`, `packages/thirdweb/src/extensions/modules/__generated__/MintableERC1155/read/getSaleConfig.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC1155/read/getSaleConfig.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC20/read/getClaimCondition.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC721/read/getClaimCondition.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC721/read/getTransferValidator.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC721/read/getDefaultRoyaltyInfo.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC1155/read/getTransferValidator.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC1155/read/getDefaultRoyaltyInfo.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC20/read/isTransferEnabled.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC721/read/isTransferEnabled.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC721/read/getTransferValidationFunction.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC1155/read/isTransferEnabled.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC20/read/encodeBytesOnInstall.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC1155/read/getTransferValidationFunction.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC721/read/encodeBytesOnInstall.ts`, `packages/thirdweb/src/extensions/modules/__generated__/BatchMetadataERC721/read/encodeBytesOnInstall.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC1155/read/encodeBytesOnInstall.ts`, `packages/thirdweb/src/extensions/modules/__generated__/BatchMetadataERC721/read/getAllMetadataBatches.ts`, `packages/thirdweb/src/extensions/modules/__generated__/SequentialTokenIdERC1155/read/getNextTokenId.ts`, `packages/thirdweb/src/extensions/modules/__generated__/BatchMetadataERC1155/read/encodeBytesOnInstall.ts`, `packages/thirdweb/src/extensions/modules/__generated__/BatchMetadataERC1155/read/getAllMetadataBatches.ts`, `packages/thirdweb/src/extensions/modules/__generated__/SequentialTokenIdERC1155/read/encodeBytesOnInstall.ts`, `packages/thirdweb/src/extensions/modules/__generated__/OpenEditionMetadataERC721/read/encodeBytesOnInstall.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ERC20Core/write/burn.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ERC20Core/write/mint.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ERC721Core/write/burn.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ERC721Core/write/mint.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ERC1155Core/write/burn.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ERC1155Core/write/mint.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ERC20Core/write/initialize.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ERC721Core/write/initialize.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ERC1155Core/write/initialize.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ERC20Core/write/mintWithSignature.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ERC721Core/write/mintWithSignature.ts`, `packages/thirdweb/src/extensions/modules/common/getOrDeployModule.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ERC1155Core/write/mintWithSignature.ts`, `packages/thirdweb/src/extensions/modules/__generated__/MintableERC1155/write/setTokenURI.ts`, `packages/thirdweb/src/extensions/modules/__generated__/MintableERC20/write/setSaleConfig.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC721/write/setRoyaltyInfoForToken.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC20/write/setSaleConfig.ts`, `packages/thirdweb/src/extensions/modules/__generated__/MintableERC721/write/setSaleConfig.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC721/write/setTransferValidator.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC1155/write/setRoyaltyInfoForToken.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC721/write/setSaleConfig.ts`, `packages/thirdweb/src/extensions/modules/__generated__/MintableERC1155/write/setSaleConfig.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC1155/write/setTransferValidator.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC721/write/setDefaultRoyaltyInfo.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC20/write/setClaimCondition.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC1155/write/setSaleConfig.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC1155/write/setDefaultRoyaltyInfo.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC721/write/setClaimCondition.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC20/write/setTransferable.ts`, `apps/portal/src/app/typescript/v5/modular/page.mdx`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC20/write/setTransferableFor.ts`, `packages/thirdweb/src/extensions/modules/__generated__/BatchMetadataERC721/write/uploadMetadata.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC721/write/setTransferable.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC721/write/setTransferableFor.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC1155/write/setClaimConditionByTokenId.ts`, `packages/thirdweb/src/extensions/modules/__generated__/BatchMetadataERC1155/write/uploadMetadata.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC1155/write/setTransferable.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC1155/write/setTransferableFor.ts`, `packages/thirdweb/src/extensions/modules/__generated__/OpenEditionMetadataERC721/write/setSharedMetadata.ts`, `apps/portal/src/app/typescript/v5/modular/built-in/page.tsx`, `apps/portal/src/app/typescript/v5/extensions/built-in/page.tsx`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC721/read/royaltyInfo.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC1155/read/royaltyInfo.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC721/read/getRoyaltyInfoForToken.ts`, `packages/thirdweb/src/extensions/modules/__generated__/RoyaltyERC1155/read/getRoyaltyInfoForToken.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC20/read/isTransferEnabledFor.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC721/read/isTransferEnabledFor.ts`, `packages/thirdweb/src/extensions/modules/__generated__/TransferableERC1155/read/isTransferEnabledFor.ts`, `packages/thirdweb/src/extensions/modules/__generated__/ClaimableERC1155/read/getClaimConditionByTokenId.ts`, `packages/thirdweb/src/extensions/modules/__generated__/OpenEditionMetadataERC721/read/onTokenURI.ts`, `packages/thirdweb/src/exports/modules.ts`, `apps/portal/src/app/references/components/TDoc/utils/slugs.ts`, `apps/portal/src/app/references/components/TDoc/utils/getSidebarLinkgroups.ts`, `apps/portal/src/app/typescript/v5/sidebar.tsx`

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->
2024-09-12 09:41:36 +00:00

194 lines
5.9 KiB
TypeScript

import { maxUint256 } from "viem";
import { NATIVE_TOKEN_ADDRESS } from "../../../constants/addresses.js";
import type { ThirdwebContract } from "../../../contract/contract.js";
import type { BaseTransactionOptions } from "../../../transaction/types.js";
import type { Address } from "../../../utils/address.js";
import { dateToSeconds, tenYearsFromNow } from "../../../utils/date.js";
import type { Hex } from "../../../utils/encoding/hex.js";
import type { NFTInput } from "../../../utils/nft/parseNft.js";
import { randomBytesHex } from "../../../utils/random.js";
import type { Account } from "../../../wallets/interfaces/wallet.js";
import { mintWithSignature as generatedMint } from "../__generated__/ERC1155Core/write/mintWithSignature.js";
import {
type EncodeBytesBeforeMintWithSignatureERC1155Params,
encodeBytesBeforeMintWithSignatureERC1155Params,
} from "../__generated__/MintableERC1155/encode/encodeBytesBeforeMintWithSignatureERC1155.js";
/**
* Mints ERC1155 tokens to a specified address with a signature via a MintableERC1155 module.
* @param options The options for minting tokens.
* @returns A transaction to mint tokens.
* @example
* ```typescript
* import { MintableERC1155 } from "thirdweb/modules";
*
* // generate the payload and signature, this is typically done on the server
* // requires to be generated with a wallet that has the MINTER_ROLE
* const { payload, signature } = await MintableERC1155.generateMintSignature({
* account,
* contract,
* nft: {
* name: "My NFT",
* description: "This is my NFT",
* image: "ipfs://...",
* },
* mintRequest: {
* recipient: "0x...",
* quantity: "10",
* },
* });
*
* // prepare the transaction, this is typically done on the client
* // can be executed by any wallet
* const transaction = MintableERC1155.mintWithSignature({
* contract,
* payload,
* signature,
* });
*
* // Send the transaction
* await sendTransaction({ transaction, account });
* ```
* @modules MintableERC1155
*/
export function mintWithSignature(
options: BaseTransactionOptions<
Awaited<ReturnType<typeof generateMintSignature>>
>,
) {
return generatedMint({
contract: options.contract,
asyncParams: async () => {
const { payload, signature } = options;
return {
to: payload.to,
tokenId: payload.tokenId,
baseURI: payload.baseURI,
amount: payload.amount,
data: payload.data,
signature,
};
},
});
}
export type GenerateMintSignatureOptions = {
account: Account;
contract: ThirdwebContract;
nft: NFTInput | string;
mintRequest: GeneratePayloadInput;
};
/**
* Generates a payload and signature for minting ERC1155 tokens with a signature.
* @param options The options for generating the payload and signature.
* @returns The payload and signature.
* @example
* ```typescript
* import { MintableERC1155 } from "thirdweb/modules";
*
* // generate the payload and signature, this is typically done on the server
* // requires to be generated with a wallet that has the MINTER_ROLE
* const { payload, signature } = await MintableERC1155.generateMintSignature({
* account,
* contract,
* nft: {
* name: "My NFT",
* description: "This is my NFT",
* image: "ipfs://...",
* },
* mintRequest: {
* recipient: "0x...",
* quantity: "10",
* },
* });
*
* // prepare the transaction, this is typically done on the client
* // can be executed by any wallet
* const transaction = MintableERC1155.mintWithSignature({
* contract,
* payload,
* signature,
* });
*
* // Send the transaction
* await sendTransaction({ transaction, account });
* ```
* @modules MintableERC1155
*/
export async function generateMintSignature(
options: GenerateMintSignatureOptions,
) {
const { mintRequest, account, contract } = options;
const currency = mintRequest.currency || NATIVE_TOKEN_ADDRESS;
const pricePerUnit = options.mintRequest.pricePerUnit || 0n;
const uid = mintRequest.uid || randomBytesHex();
const startTime = mintRequest.validityStartTimestamp || new Date(0);
const endTime = mintRequest.validityEndTimestamp || tenYearsFromNow();
let metadataURI: string;
if (typeof options.nft === "string") {
// if the input is already a string then we just use that
metadataURI = options.nft;
} else {
// otherwise we need to upload the file to the storage server
// load the upload code if we need it
const { upload } = await import("../../../storage/upload.js");
metadataURI = await upload({
client: options.contract.client,
files: [options.nft],
});
}
const mintParams: EncodeBytesBeforeMintWithSignatureERC1155Params["params"] =
{
pricePerUnit,
uid,
currency,
startTimestamp: Number(dateToSeconds(startTime)),
endTimestamp: Number(dateToSeconds(endTime)),
};
const payload = {
to: mintRequest.recipient,
tokenId: mintRequest.tokenId ?? maxUint256,
amount: mintRequest.quantity,
baseURI: metadataURI,
data: encodeBytesBeforeMintWithSignatureERC1155Params({
params: mintParams,
}),
};
const signature = await account.signTypedData({
domain: {
name: "ERC1155Core",
version: "1",
chainId: contract.chain.id,
verifyingContract: contract.address as Hex,
},
types: { MintRequestERC1155: MintRequestERC1155 },
primaryType: "MintRequestERC1155",
message: payload,
});
return { payload, signature };
}
type GeneratePayloadInput = {
recipient: Address;
quantity: bigint;
tokenId?: bigint;
currency?: Address;
pricePerUnit?: bigint;
uid?: Hex;
validityStartTimestamp?: Date;
validityEndTimestamp?: Date;
};
export const MintRequestERC1155 = [
{ type: "address", name: "to" },
{ type: "uint256", name: "tokenId" },
{ type: "uint256", name: "amount" },
{ type: "string", name: "baseURI" },
{ type: "bytes", name: "data" },
] as const;