Blockwell

Zapper NFT

About

Stats

Public Functions 18
Event Types 5
Code Size 45,950 bytes

Library Use

Uses Counters for Counters.Counter.

Events (5) keyboard_arrow_up

ApprovalForAll Event

Parameters help
account
address help
operator
address help
approved
bool help

OwnershipTransferred Event

Parameters help
previousOwner
address help
newOwner
address help

TransferBatch Event

Parameters help
operator
address help
from
address help
to
address help
ids
uint256[] help
values
uint256[] help

TransferSingle Event

Parameters help
operator
address help
from
address help
to
address help
id
uint256 help
value
uint256 help

URI Event

Parameters help
value
string help
id
uint256 help

paused Variable

bool help

name Variable

string help

symbol Variable

string help

_signer Variable

address help

ID Variable

Counters.Counter help
Internal Variable

idToUri Variable

mapping(uint256 => string) help
Internal Variable

tokenSupply Variable

mapping(uint256 => uint256) help
Internal Variable

hasMinted Variable

mapping(uint256 => mapping(address => bool)) help
Internal Variable

_balances Variable

mapping(uint256 => mapping(address => uint256)) help
Internal Variable

_operatorApprovals Variable

mapping(address => mapping(address => bool)) help
Internal Variable

_uri Variable

string help
Internal Variable

_owner Variable

address help
Internal Variable

Functions Expand All Collapse All

getMessageHash keyboard_arrow_up

Parameters help

Name Type
account
address help
id
uint256 help

Properties

Visibility help public
Mutability help pure
Source Code
function getMessageHash(address account, uint256 id)
  public
  pure
  returns (bytes32)
{
  return keccak256(abi.encodePacked(account, id));
}

owner keyboard_arrow_up

Parameters help

This function has no parameters.

Properties

Visibility help public
Mutability help view
Source Code
function owner() public view virtual returns (address) {
  return _owner;
}

renounceOwnership keyboard_arrow_up

Parameters help

This function has no parameters.

Properties

Visibility help public
Mutability help transaction

Modifiers help

Source Code
function renounceOwnership() public virtual onlyOwner {
  emit OwnershipTransferred(_owner, address(0));
  _owner = address(0);
}

transferOwnership keyboard_arrow_up

Parameters help

Name Type
newOwner
address help

Properties

Visibility help public
Mutability help transaction

Modifiers help

Requirements help

Source Code
function transferOwnership(address newOwner) public virtual onlyOwner {
  require(newOwner != address(0), "Ownable: new owner is the zero address");
  emit OwnershipTransferred(_owner, newOwner);
  _owner = newOwner;
}

supportsInterface keyboard_arrow_up

Parameters help

Name Type
interfaceId
bytes4 help

Properties

Visibility help public
Mutability help view
Source Code
function supportsInterface(bytes4 interfaceId)
  public
  view
  virtual
  override(ERC165, IERC165)
  returns (bool)
{
  return
    interfaceId == type(IERC1155).interfaceId ||
    interfaceId == type(IERC1155MetadataURI).interfaceId ||
    super.supportsInterface(interfaceId);
}

uri keyboard_arrow_up

Parameters help

Name Type
_id
uint256 help

Properties

Visibility help public
Mutability help view
Source Code
function uri(uint256 _id) public view override returns (string memory) {
  return idToUri[_id];
}

Parameters help

Name Type
account
address help
id
uint256 help

Properties

Visibility help public
Mutability help view

Requirements help

Source Code
function balanceOf(address account, uint256 id)
  public
  view
  virtual
  override
  returns (uint256)
{
  require(account != address(0), "ERC1155: balance query for the zero address");
  return _balances[id][account];
}

balanceOfBatch keyboard_arrow_up

Parameters help

Name Type
accounts
address[] help
ids
uint256[] help

Properties

Visibility help public
Mutability help view
Source Code
function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
  public
  view
  virtual
  override
  returns (uint256[] memory)
{
  require(
    accounts.length == ids.length,
    "ERC1155: accounts and ids length mismatch"
  );

  uint256[] memory batchBalances = new uint256[](accounts.length);

  for (uint256 i = 0; i < accounts.length; ++i) {
    batchBalances[i] = balanceOf(accounts[i], ids[i]);
  }

  return batchBalances;
}

setApprovalForAll keyboard_arrow_up

Parameters help

Name Type
operator
address help
approved
bool help

Properties

Visibility help public
Mutability help transaction

Requirements help

Source Code
function setApprovalForAll(address operator, bool approved)
  public
  virtual
  override
{
  require(
    _msgSender() != operator,
    "ERC1155: setting approval status for self"
  );

  _operatorApprovals[_msgSender()][operator] = approved;
  emit ApprovalForAll(_msgSender(), operator, approved);
}

isApprovedForAll keyboard_arrow_up

Parameters help

Name Type
account
address help
operator
address help

Properties

Visibility help public
Mutability help view
Source Code
function isApprovedForAll(address account, address operator)
  public
  view
  virtual
  override
  returns (bool)
{
  return _operatorApprovals[account][operator];
}

safeTransferFrom keyboard_arrow_up

Parameters help

Name Type
from
address help
to
address help
id
uint256 help
amount
uint256 help
data
bytes help

Properties

Visibility help public
Mutability help transaction
Source Code
function safeTransferFrom(
  address from,
  address to,
  uint256 id,
  uint256 amount,
  bytes memory data
) public virtual override {
  require(to != address(0), "ERC1155: transfer to the zero address");
  require(
    from == _msgSender() || isApprovedForAll(from, _msgSender()),
    "ERC1155: caller is not owner nor approved"
  );

  address operator = _msgSender();

  _beforeTokenTransfer(
    operator,
    from,
    to,
    _asSingletonArray(id),
    _asSingletonArray(amount),
    data
  );

  uint256 fromBalance = _balances[id][from];
  require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
  _balances[id][from] = fromBalance - amount;
  _balances[id][to] += amount;

  emit TransferSingle(operator, from, to, id, amount);

  _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
}

safeBatchTransferFrom keyboard_arrow_up

Parameters help

Name Type
from
address help
to
address help
ids
uint256[] help
amounts
uint256[] help
data
bytes help

Properties

Visibility help public
Mutability help transaction
Source Code
function safeBatchTransferFrom(
  address from,
  address to,
  uint256[] memory ids,
  uint256[] memory amounts,
  bytes memory data
) public virtual override {
  require(
    ids.length == amounts.length,
    "ERC1155: ids and amounts length mismatch"
  );
  require(to != address(0), "ERC1155: transfer to the zero address");
  require(
    from == _msgSender() || isApprovedForAll(from, _msgSender()),
    "ERC1155: transfer caller is not owner nor approved"
  );

  address operator = _msgSender();

  _beforeTokenTransfer(operator, from, to, ids, amounts, data);

  for (uint256 i = 0; i < ids.length; ++i) {
    uint256 id = ids[i];
    uint256 amount = amounts[i];

    uint256 fromBalance = _balances[id][from];
    require(
      fromBalance >= amount,
      "ERC1155: insufficient balance for transfer"
    );
    _balances[id][from] = fromBalance - amount;
    _balances[id][to] += amount;
  }

  emit TransferBatch(operator, from, to, ids, amounts);

  _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
}

create keyboard_arrow_up

Parameters help

Name Type
_cid
string help
_data
bytes help

Properties

Visibility help public
Mutability help transaction

Modifiers help

Requirements help

Source Code
function create(string calldata _cid, bytes calldata _data)
  external
  onlyOwner
  returns (uint256 _id)
{
  require(bytes(_cid).length > 0, "Err: Missing Content Identifier");

  _id = _nextId();

  _mint(msg.sender, _id, 0, _data);

  string memory _uri = _createUri(_cid);
  idToUri[_id] = _uri;

  emit URI(_uri, _id);
}

mint keyboard_arrow_up

Parameters help

Name Type
_account
address help
_id
uint256 help
_signature
bytes help
_data
bytes help

Properties

Visibility help public
Mutability help transaction

Modifiers help

pausable checks for the following:
Source Code
function mint(
  address _account,
  uint256 _id,
  bytes calldata _signature,
  bytes calldata _data
) public pausable {
  require(_exists(_id), "Err: Invalid ID");
  require(!hasMinted[_id][_account], "Err: Already Minted");
  require(verify(_account, _id, _signature), "Err: Invalid Signature");

  hasMinted[_id][_account] = true;
  _mint(_account, _id, 1, _data);

  tokenSupply[_id]++;
}

batchMint keyboard_arrow_up

Parameters help

Name Type
_account
address help
_ids
uint256[] help
_signatures
bytes[] help
_data
bytes[] help

Properties

Visibility help public
Mutability help transaction

Modifiers help

pausable checks for the following:
Source Code
function batchMint(
  address _account,
  uint256[] calldata _ids,
  bytes[] calldata _signatures,
  bytes[] calldata _data
) external pausable {
  for (uint256 i = 0; i < _ids.length; i++) {
    mint(_account, _ids[i], _signatures[i], _data[i]);
  }
}

Parameters help

Name Type
_id
uint256 help

Properties

Visibility help public
Mutability help view
Source Code
function totalSupply(uint256 _id) public view returns (uint256) {
  return tokenSupply[_id];
}

pause keyboard_arrow_up

Parameters help

This function has no parameters.

Properties

Visibility help public
Mutability help transaction

Modifiers help

Source Code
function pause() public onlyOwner {
  paused = !paused;
}

updateSigner keyboard_arrow_up

Parameters help

Name Type
signer
address help

Properties

Visibility help public
Mutability help transaction

Modifiers help

Source Code
function updateSigner(address signer) public onlyOwner {
  _signer = signer;
}

Internal Functions Expand All Collapse All

Internal functions are parts of the contract that can't be used directly, but instead are used by the public functions listed above.

internal Zapper_NFT_V1_0_5._createUri keyboard_arrow_up

Parameters help

Name Type
_cid
string help

Properties

Visibility help internal
Mutability help view
Source Code
function _createUri(string memory _cid)
  internal
  view
  returns (string memory _uri)
{
  string memory baseUri = super.uri(0);
  return string(abi.encodePacked(baseUri, _cid));
}

internal Zapper_NFT_V1_0_5._nextId keyboard_arrow_up

Parameters help

This function has no parameters.

Properties

Visibility help internal
Mutability help transaction
Source Code
function _nextId() internal returns (uint256 id) {
  ID.increment();
  return ID.current();
}

internal Zapper_NFT_V1_0_5._exists keyboard_arrow_up

Parameters help

Name Type
_id
uint256 help

Properties

Visibility help internal
Mutability help view
Source Code
function _exists(uint256 _id) internal view returns (bool) {
  return (bytes(idToUri[_id]).length > 0);
}

internal ERC1155._setURI keyboard_arrow_up

Parameters help

Name Type
newuri
string help

Properties

Visibility help internal
Mutability help transaction
Source Code
function _setURI(string memory newuri) internal virtual {
  _uri = newuri;
}

internal ERC1155._mint keyboard_arrow_up

Parameters help

Name Type
account
address help
id
uint256 help
amount
uint256 help
data
bytes help

Properties

Visibility help internal
Mutability help transaction

Requirements help

Source Code
function _mint(
  address account,
  uint256 id,
  uint256 amount,
  bytes memory data
) internal virtual {
  require(account != address(0), "ERC1155: mint to the zero address");

  address operator = _msgSender();

  _beforeTokenTransfer(
    operator,
    address(0),
    account,
    _asSingletonArray(id),
    _asSingletonArray(amount),
    data
  );

  _balances[id][account] += amount;
  emit TransferSingle(operator, address(0), account, id, amount);

  _doSafeTransferAcceptanceCheck(
    operator,
    address(0),
    account,
    id,
    amount,
    data
  );
}

internal ERC1155._mintBatch keyboard_arrow_up

Parameters help

Name Type
to
address help
ids
uint256[] help
amounts
uint256[] help
data
bytes help

Properties

Visibility help internal
Mutability help transaction
Source Code
function _mintBatch(
  address to,
  uint256[] memory ids,
  uint256[] memory amounts,
  bytes memory data
) internal virtual {
  require(to != address(0), "ERC1155: mint to the zero address");
  require(
    ids.length == amounts.length,
    "ERC1155: ids and amounts length mismatch"
  );

  address operator = _msgSender();

  _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

  for (uint256 i = 0; i < ids.length; i++) {
    _balances[ids[i]][to] += amounts[i];
  }

  emit TransferBatch(operator, address(0), to, ids, amounts);

  _doSafeBatchTransferAcceptanceCheck(
    operator,
    address(0),
    to,
    ids,
    amounts,
    data
  );
}

internal ERC1155._burn keyboard_arrow_up

Parameters help

Name Type
account
address help
id
uint256 help
amount
uint256 help

Properties

Visibility help internal
Mutability help transaction
Source Code
function _burn(
  address account,
  uint256 id,
  uint256 amount
) internal virtual {
  require(account != address(0), "ERC1155: burn from the zero address");

  address operator = _msgSender();

  _beforeTokenTransfer(
    operator,
    account,
    address(0),
    _asSingletonArray(id),
    _asSingletonArray(amount),
    ""
  );

  uint256 accountBalance = _balances[id][account];
  require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
  _balances[id][account] = accountBalance - amount;

  emit TransferSingle(operator, account, address(0), id, amount);
}

internal ERC1155._burnBatch keyboard_arrow_up

Parameters help

Name Type
account
address help
ids
uint256[] help
amounts
uint256[] help

Properties

Visibility help internal
Mutability help transaction
Source Code
function _burnBatch(
  address account,
  uint256[] memory ids,
  uint256[] memory amounts
) internal virtual {
  require(account != address(0), "ERC1155: burn from the zero address");
  require(
    ids.length == amounts.length,
    "ERC1155: ids and amounts length mismatch"
  );

  address operator = _msgSender();

  _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");

  for (uint256 i = 0; i < ids.length; i++) {
    uint256 id = ids[i];
    uint256 amount = amounts[i];

    uint256 accountBalance = _balances[id][account];
    require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
    _balances[id][account] = accountBalance - amount;
  }

  emit TransferBatch(operator, account, address(0), ids, amounts);
}

internal ERC1155._beforeTokenTransfer keyboard_arrow_up

Parameters help

Name Type
operator
address help
from
address help
to
address help
ids
uint256[] help
amounts
uint256[] help
data
bytes help

Properties

Visibility help internal
Mutability help transaction
Source Code
function _beforeTokenTransfer(
  address operator,
  address from,
  address to,
  uint256[] memory ids,
  uint256[] memory amounts,
  bytes memory data
) internal virtual {}

internal ERC1155._doSafeTransferAcceptanceCheck keyboard_arrow_up

Parameters help

Name Type
operator
address help
from
address help
to
address help
id
uint256 help
amount
uint256 help
data
bytes help

Properties

Visibility help private
Mutability help transaction
Source Code
function _doSafeTransferAcceptanceCheck(
  address operator,
  address from,
  address to,
  uint256 id,
  uint256 amount,
  bytes memory data
) private {
  if (to.isContract()) {
    try
      IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data)
    returns (bytes4 response) {
      if (response != IERC1155Receiver(to).onERC1155Received.selector) {
        revert("ERC1155: ERC1155Receiver rejected tokens");
      }
    } catch Error(string memory reason) {
      revert(reason);
    } catch {
      revert("ERC1155: transfer to non ERC1155Receiver implementer");
    }
  }
}

internal ERC1155._doSafeBatchTransferAcceptanceCheck keyboard_arrow_up

Parameters help

Name Type
operator
address help
from
address help
to
address help
ids
uint256[] help
amounts
uint256[] help
data
bytes help

Properties

Visibility help private
Mutability help transaction
Source Code
function _doSafeBatchTransferAcceptanceCheck(
  address operator,
  address from,
  address to,
  uint256[] memory ids,
  uint256[] memory amounts,
  bytes memory data
) private {
  if (to.isContract()) {
    try
      IERC1155Receiver(to).onERC1155BatchReceived(
        operator,
        from,
        ids,
        amounts,
        data
      )
    returns (bytes4 response) {
      if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) {
        revert("ERC1155: ERC1155Receiver rejected tokens");
      }
    } catch Error(string memory reason) {
      revert(reason);
    } catch {
      revert("ERC1155: transfer to non ERC1155Receiver implementer");
    }
  }
}

internal ERC1155._asSingletonArray keyboard_arrow_up

Parameters help

Name Type
element
uint256 help

Properties

Visibility help private
Mutability help pure
Source Code
function _asSingletonArray(uint256 element)
  private
  pure
  returns (uint256[] memory)
{
  uint256[] memory array = new uint256[](1);
  array[0] = element;

  return array;
}

internal Context._msgSender keyboard_arrow_up

Parameters help

This function has no parameters.

Properties

Visibility help internal
Mutability help view
Source Code
function _msgSender() internal view virtual returns (address) {
  return msg.sender;
}

internal Context._msgData keyboard_arrow_up

Parameters help

This function has no parameters.

Properties

Visibility help internal
Mutability help view
Source Code
function _msgData() internal view virtual returns (bytes calldata) {
  this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
  return msg.data;
}

internal Context._msgSender keyboard_arrow_up

Parameters help

This function has no parameters.

Properties

Visibility help internal
Mutability help view
Source Code
function _msgSender() internal view virtual returns (address) {
  return msg.sender;
}

internal Context._msgData keyboard_arrow_up

Parameters help

This function has no parameters.

Properties

Visibility help internal
Mutability help view
Source Code
function _msgData() internal view virtual returns (bytes calldata) {
  this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
  return msg.data;
}

internal SignatureVerifier.verify keyboard_arrow_up

Parameters help

Name Type
account
address help
id
uint256 help
signature
bytes help

Properties

Visibility help internal
Mutability help view
Source Code
function verify(
  address account,
  uint256 id,
  bytes memory signature
) internal view returns (bool) {
  bytes32 messageHash = getMessageHash(account, id);
  bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);

  return recoverSigner(ethSignedMessageHash, signature) == _signer;
}

internal SignatureVerifier.getEthSignedMessageHash keyboard_arrow_up

Parameters help

Name Type
messageHash
bytes32 help

Properties

Visibility help internal
Mutability help pure
Source Code
function getEthSignedMessageHash(bytes32 messageHash)
  internal
  pure
  returns (bytes32)
{
  return
    keccak256(
      abi.encodePacked("\x19Ethereum Signed Message:\n32", messageHash)
    );
}

internal SignatureVerifier.recoverSigner keyboard_arrow_up

Parameters help

Name Type
_ethSignedMessageHash
bytes32 help
_signature
bytes help

Properties

Visibility help internal
Mutability help pure
Source Code
function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature)
  internal
  pure
  returns (address)
{
  (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);

  return ecrecover(_ethSignedMessageHash, v, r, s);
}

internal SignatureVerifier.splitSignature keyboard_arrow_up

Parameters help

Name Type
signature
bytes help

Properties

Visibility help internal
Mutability help pure

Requirements help

Source Code
function splitSignature(bytes memory signature)
  internal
  pure
  returns (
    bytes32 r,
    bytes32 s,
    uint8 v
  )
{
  require(signature.length == 65, "invalid signature length");

  assembly {
    r := mload(add(signature, 32))
    s := mload(add(signature, 64))
    v := byte(0, mload(add(signature, 96)))
  }
}