Skip to main content

ERC20 Signature Mint

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

The ERC20SignatureMint smart contract adds the signature-based minting extension functionality to the ERC20Base contract.

Signature minting uses EIP-712, which enables the 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 others to mint tokens on your contract, and specify what exactly will be minted by that external party.

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: MIT
pragma solidity ^0.8.0;

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

contract MyToken is ERC20SignatureMint {
constructor(
address _defaultAdmin,
string memory _name,
string memory _symbol,
address _primarySaleRecipient
)
ERC20SignatureMint(
_defaultAdmin,
_name,
_symbol,
_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
returns (address signer)
{
require(_req.quantity > 0, "Minting zero tokens.");

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

address receiver = _req.to;

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

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

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

uint256 totalPrice = (_quantityToClaim * _pricePerToken) / 1 ether;
require(totalPrice > 0, "quantity too low");

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);
}