# @franknft.eth/erc721-f

> ERC721F contract for Solidity

Latest version **5.7.0** (published 2026-08-08) · MIT license · 0 weekly downloads

## Install

```sh
npm install @franknft.eth/erc721-f
pnpm add @franknft.eth/erc721-f
yarn add @franknft.eth/erc721-f
bun add @franknft.eth/erc721-f
```

## Health

**Score 60/100 (C)** — status: active.

Positive: esm support; no vulnerabilities; recently updated; high maintenance score.

Warnings: low downloads; no types.

## Facts

| | |
|---|---|
| Version | 5.7.0 |
| Published | 2026-08-08 |
| First published | 2022-12-02 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | ESM |
| Node | >=24 |
| Dependencies | 1 |
| Unpacked size | 67.9 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 31 |
| Author | FrankNFT-labs |
| Maintainers | franknft.eth |
| Keywords | solidity, ethereum, erc721, nft, erc721f |

## Links

- npm: https://www.npmjs.com/package/@franknft.eth/erc721-f
- Repository: https://github.com/FrankNFT-labs/ERC721F
- Homepage: https://github.com/FrankNFT-labs/ERC721F#readme
- Issues: https://github.com/FrankNFT-labs/ERC721F/issues
- npm.io page: https://npm.io/package/@franknft.eth/erc721-f

## Dependencies (1)

- [@openzeppelin/contracts](https://npm.io/package/@openzeppelin/contracts.md) ^5.7.0

## Alternatives

- [@sindresorhus/slugify](https://npm.io/package/@sindresorhus/slugify.md) — 3.7M weekly downloads
- [solid-js](https://npm.io/package/solid-js.md) — 2.7M weekly downloads
- [expo-glass-effect](https://npm.io/package/expo-glass-effect.md) — 2.5M weekly downloads
- [nanoassert](https://npm.io/package/nanoassert.md) — 780.8K weekly downloads
- [@ffmpeg/ffmpeg](https://npm.io/package/@ffmpeg/ffmpeg.md) — 529.5K weekly downloads

## Recent versions

- 5.7.0 (latest) — 2026-08-08
- 5.6.1 — 2026-03-25
- 5.0.4 — 2024-09-25
- 5.0.3 — 2024-08-29
- 5.0.2 — 2024-08-23
- 5.0.1 — 2024-04-17
- 5.0.0 — 2023-10-17
- 4.8.2 — 2023-07-06
- 4.8.1 — 2023-04-06
- 4.8.0 — 2022-12-06
- 4.7.3 — 2022-12-02

## README

[![MIT License][license-shield]][license-url]
[![NPM][npm-shield]][npm-url]
[![Solidity][solidity-shield]][solidity-url]
[![Build][build-shield]][build-url]

# ERC721F

The goal of ERC721F is to provide a simple extension of IERC721 with significant gas savings for minting multiple and single NFTs in a single transaction. This project and implementation will be updated regularly and will continue to stay up to date with best practices.
Another key goal of ERC721F is to facilitate educational opportunities for new web3 developers, fostering a supportive learning environment and driving innovation within the community.

ERC721F extends ERC721 Non-Fungible Token Standard basic implementation. ERC721F eliminates the need for ERC721Enumerable, yet retains the functionality of totalSupply() and walletOfOwner(address \_owner).

The Author is not liable for any outcomes as a result of using ERC721F. **DYOR!**
ERC721F is created and maintained by [Frank Poncelet](https://frankponcelet.com)
(FrankNFT.eth)

<!-- LEARNING PATH -->

## Learning Path

ERC721F ships a set of progressively more advanced example contracts designed to onboard new Solidity developers step by step.
Each example builds on the previous one and introduces exactly one new concept.

| Step | Contract                                                                               | Concepts introduced                                             |
| ---- | -------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
| 1    | [`examples/FreeMint.sol`](./examples/FreeMint.sol)                                     | Basic ERC721F usage, ERC-2981 royalties, EOA-only guard         |
| 2    | [`examples/AllowList.sol`](./examples/AllowList.sol)                                   | Utility mixin pattern, multiple inheritance, allowlist modifier |
| 3    | [`examples/AllowListWithAmount.sol`](./examples/AllowListWithAmount.sol)               | Per-address mint quota, internal state decrement                |
| 4    | [`examples/MerkleRoot.sol`](./examples/MerkleRoot.sol)                                 | Merkle-proof whitelisting, pre-sale / public-sale state machine |
| 5    | [`contracts/token/soulbound/Soulbound.sol`](./contracts/token/soulbound/Soulbound.sol) | Non-transferable tokens, EIP-5192, EIP-6454                     |
| 6    | [`examples/OnChain.sol`](./examples/OnChain.sol)                                       | On-chain SVG metadata, EIP-4883, string assembly                |
| 7    | [`examples/OnChainOptimized.sol`](./examples/OnChainOptimized.sol)                     | Bitfield trait packing — advanced storage optimization          |
| 8    | [`examples/ChainLink.sol`](./examples/ChainLink.sol)                                   | External oracle integration, Chainlink VRF callback pattern     |
| 9    | [`examples/EIP-2535/`](./examples/EIP-2535/)                                           | Diamond proxy (EIP-2535), upgradeability, facets                |

> Gas benchmarks comparing ERC721F against OpenZeppelin ERC721Enumerable are in [`BENCHMARK.md`](./BENCHMARK.md).

<!-- ROADMAP -->

## Roadmap

- [x] Add more documentation on benefits of using ERC721F
- [x] Continue to try to reduce gas costs
- [x] Start automated testing
- [x] Put package under Agentic AI control

See the [open issues](https://github.com/FrankNFT-labs/ERC721F/issues) for a full list of proposed features (and known issues).

## Security

Please refer to [SECURITY.md](./SECURITY.md) for our security policy and how to responsibly report vulnerabilities.

<!-- USAGE EXAMPLES -->

## Usage

### Installation

```
npm install @franknft.eth/erc721-f
```

### Requirements

- **Solidity**: `^0.8.20 <0.9.0` (the toolchain compiles with `0.8.24`)
- **Node.js**: `>=24`
- **OpenZeppelin**: `5.7.0`

Just import the file from the package like this:

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20 <0.9.0;

import "@franknft.eth/erc721-f/contracts/token/ERC721/ERC721FCOMMON.sol";

contract Example is ERC721FCOMMON {
    constructor() ERC721FCOMMON("Example", "Example", msg.sender) {
        setBaseTokenURI(
            "ipfs://QmVy7VQUFtTQawBsp4tbJPp9MgbTKS4L7WSDpZEdZUzsiD/"
        );
    }

    /**
     * Mint your tokens here.
     */
    function mint(uint256 numberOfTokens) external {
        require(msg.sender == tx.origin, "No Contracts allowed.");
        uint256 supply = totalSupply();
        for (uint256 i; i < numberOfTokens; ) {
            _mint(msg.sender, supply + i); // no need to use safeMint as we don't allow contracts.
            unchecked {
                i++;
            }
        }
    }
}
```

Or just import the file directly from GitHub like this:

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20 <0.9.0;

import "https://github.com/FrankNFT-labs/ERC721F/blob/v5.7.0/contracts/token/ERC721/ERC721FCOMMON.sol";
```

<!-- CONTRIBUTING -->

## Contributing

See [CONTRIBUTING.md](./CONTRIBUTING.md).

[license-shield]: https://img.shields.io/badge/License-MIT-green.svg?style=for-the-badge
[license-url]: https://github.com/FrankNFT-labs/ERC721F/blob/main/LICENSE
[npm-shield]: https://img.shields.io/npm/v/@franknft.eth/erc721-f.svg?style=for-the-badge
[npm-url]: https://www.npmjs.com/package/@franknft.eth/erc721-f
[solidity-shield]: https://img.shields.io/badge/Solidity-0.8.24-blue.svg?style=for-the-badge
[solidity-url]: https://soliditylang.org
[build-shield]: https://github.com/FrankNFT-labs/ERC721F/actions/workflows/ci.yml/badge.svg
[build-url]: https://github.com/FrankNFT-labs/ERC721F/actions/workflows/ci.yml

---
_Source: https://npm.io/package/@franknft.eth/erc721-f · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
