Skip to main content

ERC1155 Signature Mint

import "@thirdweb-dev/contracts/base/ERC1155SignatureMint.sol";

The ERC1155SignatureMint smart contract adds Signature-Based Minting extensions to the ERC1155Base contract.

Signature minting uses the EIP-712 standard, and enables a contract admin to authorize an external party's request to mint tokens on the admin's contract. At a high level, this means you can authorize some external party to mint tokens on your contract, and specify what will be minted.

Detected Extensions​

Once deployed, you can use the features made available by these extensions on the SDK and dashboard:

Click on each feature to learn more about what functions are available.

Usage​

Import the contract and inherit from it.

// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;

import "@thirdweb-dev/contracts/base/ERC1155SignatureMint.sol";

contract MyNFT is ERC1155SignatureMint {
constructor(
address _defaultAdmin,
string memory _name,
string memory _symbol,
address _royaltyRecipient,
uint128 _royaltyBps,
address _primarySaleRecipient
)
ERC1155SignatureMint(
_defaultAdmin,
_name,
_symbol,
_royaltyRecipient,
_royaltyBps,
_primarySaleRecipient
)
{}
}

Functions to Override​

The following functions have been implemented on this contract & are available to be overridden to add custom logic:

mintWithSignature
    /**
* @notice Mints tokens according to the provided mint request.
*
* @param _req The payload / mint request.
* @param _signature The signature produced by an account signing the mint request.
*/
function mintWithSignature(MintRequest calldata _req, bytes calldata _signature)
external
payable
virtual
override
returns (address signer)
{
require(_req.quantity > 0, "Minting zero tokens.");

uint256 tokenIdToMint;
uint256 nextIdToMint = nextTokenIdToMint();

if (_req.tokenId == type(uint256).max) {
tokenIdToMint = nextIdToMint;
nextTokenIdToMint_ += 1;
} else {
require(_req.tokenId < nextIdToMint, "invalid id");
tokenIdToMint = _req.tokenId;
}

// Verify and process payload.
signer = _processRequest(_req, _signature);

address receiver = _req.to;

// Collect price
_collectPriceOnClaim(_req.primarySaleRecipient, _req.quantity, _req.currency, _req.pricePerToken);

// Set royalties, if applicable.
if (_req.royaltyRecipient != address(0)) {
_setupRoyaltyInfoForToken(tokenIdToMint, _req.royaltyRecipient, _req.royaltyBps);
}

// Set URI
if (_req.tokenId == type(uint256).max) {
_setTokenURI(tokenIdToMint, _req.uri);
}

// Mint tokens.
_mint(receiver, tokenIdToMint, _req.quantity, "");

emit TokensMintedWithSignature(signer, receiver, tokenIdToMint, _req);
}
_collectPriceOnClaim
 /// @dev Collects and distributes the primary sale value of NFTs being claimed.
function _collectPriceOnClaim(
address _primarySaleRecipient,
uint256 _quantityToClaim,
address _currency,
uint256 _pricePerToken
) internal virtual {
if (_pricePerToken == 0) {
return;
}

uint256 totalPrice = _quantityToClaim * _pricePerToken;

if (_currency == CurrencyTransferLib.NATIVE_TOKEN) {
require(msg.value == totalPrice, "Must send total price.");
}

address saleRecipient = _primarySaleRecipient == address(0) ? primarySaleRecipient() : _primarySaleRecipient;
CurrencyTransferLib.transferCurrency(_currency, msg.sender, saleRecipient, totalPrice);
}