npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

merklemint

v0.0.5

Published

A solution for counterfactually minting tokens on ethereum

Downloads

19

Readme

Coverage Status

Note: WebFlow integration has been removed to focus on the core functionality. It can still be found in the branch webFlow

MerkleMint

Counterfactual ERC721 Token Minting.

What is it?

A nice primer on using counterfactual things in Ethereum.

MerkleMint allows for counterfactual minting of NFT tokens. In a nutshell, by storing the root of a merkle tree on-chain, you can prove that you have a set of elements that could be minted on-chain if they were needed, but until they are needed, no sense in minting them.

Example: Lets say you Beyonce has tour coming up and she wants to use ERC721's as tickets. Lets say she expects 1 million people to attend her tour. If she were to mint each NFT Token at the start, she would be spending an enormous amount of money on gas minting all 1 million tokens. With MerkleMint however, she needs only to store the root of a merkle tree on-chain, then as each fan purchases a ticket (her fan can even pay the gas for minting!), the NFT can be minted on demand.

The beauty of using a merkle tree is that there are no scalpers: You can prove there are 1 million possible tickets, without minting them. You also can't mint a fake ticket- only the tickets within the merkle tree will be accepted as valid. You can also share the entire list of tickets before hand- by building a merkle tree out of signatures, the tree can be public, without exposing any information about individual tickets.

Merkle Mint can be used for a wide range of situations for which NFT tokens are desired, but are not performant to mint at the outset. They can be used to represent enormous collections of items on-chain with minimal gas costs.

A HeritageDao Research Project: www.heritageDao.com

QuickStart

Requirements: OpenZeppelin CLI, ganache-cli

Currently (v0.0.4) the project is designed to create a free-standing ERC-721 token (MerkleMintCore.sol). This contract is designed to be upgradable and used with the OpenZeppelin CLI/SDK system. However in the future I will include truffle migrations so that it will work with truffle deploy as well.

MerkleMintCore.sol : This is a full featured ERC-721 token based on OpenZeppelin Contracts library. There have been no changes to the OpenZeppelin code and MerkleMintCore.sol if deployed will create a full featured ERC-721 token.

MerkleMintController.sol : When assigned a minter-role for MerkleMintCore.sol this contract will mint tokens only when they have been found to exist in a registered Serie. Series are collections of counterfactually mintable tokens. Each Serie has a merkleroot saved in a struct which is checked against each time the contract is requested to mint a token.

To learn how to create a suitable merkle tree, and understand how MerkleMint works, please see the test folder and follow along below.

The project is based on OpenZeppelin's MerkleProof library.

Installation:

Part 1 (Solidity)

There are two parts to MerkleMint, the solidity contracts which verify the merkle tree and allow for counterfactual minting of tokens, and the Javascript library which simplifies interacting with the Solidity contracts.

Clone the repo.

npm install

The project uses OpenZeppelin CLI (please install it).

Deploy MerkleMintController.sol first.

oz create

Select MerkleMintController Do not run the initializeController function (we will do that once we know the address of our token).

Now deploy MerkleMintCore.sol. Copy the address of the deployed contract, we will need it to deploy our token.

oz create

Select MerkleMintCore.sol and when it prompts you if you wish to run a function select: initalize.

Use the addresses of MerkleMintController and any other address you with to have persmission to mint and pause the token contract, and enter them as an array at the command prompt for both minters and pausers.

For the prompts name and symbol, enter whatever you choose. Save the address returned of the MerkleMintCore.sol file. We will need it to link the contracts.

Now you need to link MerkleMintController.sol to MerkleMintCore.sol.

Run oz send-tx

Select the MerkleMintController contract and call the initializeController function with the address of MerkleMintCore.sol as the argument.

You now have a working MerkleMint contract. To learn how to mint tokens, look at the test folder to see an example of how it is done for testing purposes.

Part 1 (Javascript)

To see an example of how to use MerkleMint in a javascript file, look at the test folder to see an example of how the tests are run against the soldiity code.

To create a new MerkleMint object:

const {MerkleMint} = require("merklemint")

//Create a list of elements. This can be objects and should represent your Tokens. 
//You should not have duplicates (currently)
const elements = ["TokenURI1", "TokenURI2", "TokenURI3"]

//Create a new MerkleMint Object
const merkleMint = new MerkleMint(elements)

To get the root of your merkle tree:

console.log(merkleMint.getRoot())

To get a merkle proof by index of your elements:

console.log(merkleMint.getProofByIndex(0))

To get a leaf using an element in your elements array:

console.log(merkleMint.getLeaf("TokenURI1"))

To get a proof using an element in your elements array:

console.log(merkleMint.getPRoof("TokenURI1"))

More documentation on the way!

TODO:

Create a useful utility for automating the merkle mint process.

The Problem

Thanx: @Nikesh @Fran @Palla