Lazy minting of ERC721 NFTs using EIP712 standard for typed, structured data. ✨

Overview

ERC721 - Signature minting

Lazy minting of ERC721 NFTs using EIP712 standard for typed, structured data.

How it works

Lazy minting or Signature minting is a mechanism to mint NFTs (or any kind of Token) just in time, without paying the gas fees upfront, and let the user pay for it along with the price of the NFT, if any.

In traditional minting, the token is minted to a specific address, or transferred to it after minting. While for lazy minting, an authorized contract admin approves an external request/voucher and enables them to mint the token in the admin's contract.

A mint voucher or request is a struct that needs to be signed by the authorized contract admin. It has all the parameters for the NFT to be minted, aswell as additional metadata such as the price, the currency to be used.

The voucher is then hashed using the EIP712 standard and signed by the authorized contract admin. Once signed, the signer can be retrieved any time by recovering it using ECDSA algorithm from the signature. This can be used to ensure that the voucher is not tampered with, and is signed by someone who is authorized to mint tokens.

How is the voucher validity checked?

Here, we use 2 parameters to check if a specific voucher is valid.

  • If the uuid specified in the voucher has been minted. We use a mapping for UUID with their minted status to verify (mapping(bytes32 => bool) private minted;)
  • If the signer is someone who is authorized to mint the token. In this case, I check if the signer has the MINTER_ROLE role in the contract, as we use AccessControlEnumerable from OpenZeppelin library. This can be the owner, the admin for the contract aswell, as you want.

How does the signature-mint process work?

The whole process is divided into 3 main steps.

  1. The mint voucher payload generation. The contract admin creates a payload containing the details based on the parameters of the voucher. The parameters are validated, and the price is converted from the native token or the ERC20 token (if specified in the currency) into gwei (1e9 wei). And then it's ready to be signed.

  2. The voucher signing by the authorized contract admin. The payload generated is then signed using the ECDSA algorithm(ECDSA.toTypedDataHash), and the signature is returned.

  3. Minting tokens using the signed voucher. Once the signature is generated, it's forwarded to the external account trying to mint the token. Using the signatureMint function (or whatever you name it), the signature is validated first, then the NFT is minted to the specified address. The price is deducted if specified from the native tokens/ERC20, whichever is specified.

The Mint voucher

This is the struct that holds the parameters for the voucher.

struct MintVoucher {
  bytes32 uuid;
  address to;
  string uri;
  uint256 price;
  address currency;
  address paymentReceiver;
}

The parameters can be described as so:

Parameter Type Usage
uuid bytes The UUID generated for having unique signatures. This is autogenerated.
to address The address where the NFT will be sent to. Defaults to address(0)
uri string The URI containing all the metadata for the NFT to be minted.
price integer The price for the NFT to be minted. Defaults to 0.
currency address The address of the currency to be paid in. Defaults to the native currency address.
paymentReceiver address The creator of the NFT or the address, who receives the payment of the price for the NFT.

The voucher can be verified with the function provided in the SignatureMint contract.

function verify(MintVoucher calldata voucher, bytes calldata signature)
  public
  view;

This function uses the 2 validation steps mentioned above to ensure that the voucher is valid.

And, the signed voucher can be redeemed using the following function in the NFT contract.

function signatureMint(MintVoucher calldata voucher, bytes calldata signature)
  external
  payable
  nonReentrant;

This uses the verify function internally to ensure it's valid. If it is, it processes the payment and mints the NFT as specified.

Usage

Hardhat tasks are provided with the contracts in order to test the signature mint process and make it easy for anyone to use it.

Firstly, install the dependencies to get started.

npm install -D
# OR
yarn

Next, build the contracts.

yarn run build

Every task is run on the local network. If you want to use a different network, use the --network option as --network mumbai. You can check the networks supported in the hardhat config file.

Deploying a contract

You can deploy the contract using the following task:

npx hardhat deploy:NFT --name "My NFT contract" --symbol MNFT

The flags for this task are:

Flag Optional Usage
name NO The name of the NFT contract
symbol NO The symbol to be used for the tokens by the contract

Generating a signature

This task allows you to generate a signed voucher.

npx hardhat nft:generate-signature

The flags for this task are:

Flag Optional Usage
contract NO The address of the deployed NFT contract
metadata NO The URI containing metadata for the NFT to be minted
paymentreceiver NO The address which receives the payment for the NFT
to Yes. Defaults to Zero address. The address which receives the NFT.
price Yes. Defaults to zero. The price for the NFT.

Verifying a signature

This task allows you to verify the signed voucher for validity.

npx hardhat nft:verify-signature

The flags for this task are:

Flag Optional Usage
contract NO The address of the deployed NFT contract
signedpayload NO The signed payload to be verified for validity generated from generate-signature task

Minting using a signed voucher

This task allows you to verify the signed voucher for validity.

npx hardhat nft:signature-mint

The flags for this task are:

Flag Optional Usage
contract NO The address of the deployed NFT contract
signedpayload NO The signed payload to be verified for validity generated from generate-signature task

Contributing

Contributions, issues and feature requests are welcome. After cloning & setting up project locally, you can just submit a PR to this repo and it will be deployed once it's accepted.

⚠️ It’s good to have descriptive commit messages, or PR titles so that other contributors can understand about your commit or the PR Created. Read conventional commits before making the commit message.

Show your support

We love people's support in growing and improving. Be sure to leave a ⭐️ if you like the project and also be sure to contribute, if you're interested!

Made by Sunrit Jana with
You might also like...

A tiny, reactive JavaScript library for structured state and tabular data.

A JavaScript library for structured state. Using plain old JavaScript objects to manage data gets old very quickly. It's error-prone, tricky to track

Jan 1, 2023

API dot Open Sauced is NestJS and SupaBase powered OAS3 backend designed to remove client complexity and provide a structured graph of all @open-sauced integrations

API dot Open Sauced is NestJS and SupaBase powered OAS3 backend designed to remove client complexity and provide a structured graph of all @open-sauced integrations

🍕 Open Sauced Nest Supabase API 🍕 The path to your next Open Source contribution 📖 Prerequisites In order to run the project we need the following

Dec 18, 2022

jQuery UI widget for structured queries like "Contacts where Firstname starts with A and Birthday before 1/1/2000 and State in (CA, NY, FL)"...

jQuery UI widget for structured queries like

Structured-Filter · Structured-Filter is a generic Web UI for building structured search or filter queries. With it you can build structured search co

Jan 6, 2023

easily building data structures that are serializable, validatable, and fully typed.

@davecode/structures [beta/wip] Structures is a TypeScript library for easily building data structure classes that are Serializable: Can convert rich

May 22, 2022

Create your own custom NFT minting page using thirdweb's NFT Drop contract

Customizable NFT Drop Minting Page In this example, you can create your own NFT Drop minting page just by customising the template with your branding,

Dec 24, 2022

A simple, strictly typed ORM, to assist you in using Cloudflare's D1 product

D1-Orm ✨ A simple, strictly typed ORM, to assist you in using Cloudflare's D1 product API reference can be found at https://d1-orm.pages.dev/modules D

Dec 25, 2022

Finally, a simple, lightweight (0.6kb), pure JavaScript image lazy loader that even works in IE* using the IntersectionObserver API

Simply Lazy A simple & lightweight (0.6kb), pure JavaScript image lazy loader that even works in IE* utilizing the built in IntersectionObserver API i

Dec 26, 2022

A javascript standard data structure library which benchmark against C++ STL.

js-sdsl A javascript standard data structure library which benchmark against C++ STL. Note Note that our official version starts from 2.0.0. In order

Dec 10, 2022

Bootstrap an NFT minting site with Merkle tree whitelists.

🖌️ nft-merkle-whitelist-scaffold Bootstrap an NFT minting site with merkle tree whitelists. Go to nft-merkle-whitelist.vercel.app to see the latest d

Dec 24, 2022
Comments
  • Bump @openzeppelin/contracts from 4.7.1 to 4.7.2

    Bump @openzeppelin/contracts from 4.7.1 to 4.7.2

    Bumps @openzeppelin/contracts from 4.7.1 to 4.7.2.

    Release notes

    Sourced from @​openzeppelin/contracts's releases.

    v4.7.2

    :warning: This is a patch for three issues, including a high severity issue in GovernorVotesQuorumFraction. For more information visit the security advisories (1, 2, 3).

    1. GovernorVotesQuorumFraction: Fixed quorum updates so they do not affect past proposals that failed due to lack of quorum. (#3561)
    2. ERC165Checker: Added protection against large returndata. (#3587)
    3. LibArbitrumL2, CrossChainEnabledArbitrumL2: Fixed detection of cross-chain calls for EOAs. Previously, calls from EOAs would be classified as cross-chain calls. (#3578)
    Changelog

    Sourced from @​openzeppelin/contracts's changelog.

    4.7.2

    • LibArbitrumL2, CrossChainEnabledArbitrumL2: Fixed detection of cross-chain calls for EOAs. Previously, calls from EOAs would be classified as cross-chain calls. (#3578)
    • GovernorVotesQuorumFraction: Fixed quorum updates so they do not affect past proposals that failed due to lack of quorum. (#3561)
    • ERC165Checker: Added protection against large returndata. (#3587)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump @openzeppelin/contracts from 4.6.0 to 4.7.1

    Bump @openzeppelin/contracts from 4.6.0 to 4.7.1

    Bumps @openzeppelin/contracts from 4.6.0 to 4.7.1.

    Release notes

    Sourced from @​openzeppelin/contracts's releases.

    v4.7.1

    :warning: This is a patch for a medium severity issue affecting SignatureChecker and a high severity issue affecting ERC165Checker. For more information visit the security advisories (1, 2).

    • SignatureChecker: Fix an issue that causes isValidSignatureNow to revert when the target contract returns ill-encoded data. (#3552)
    • ERC165Checker: Fix an issue that causes supportsInterface to revert when the target contract returns ill-encoded data. (#3552)

    v4.7.0

    • TimelockController: Migrate _call to _execute and allow inheritance and overriding similar to Governor. (#3317)
    • CrossChainEnabledPolygonChild: replace the require statement with the custom error NotCrossChainCall. (#3380)
    • ERC20FlashMint: Add customizable flash fee receiver. (#3327)
    • ERC4626: add an extension of ERC20 that implements the ERC4626 Tokenized Vault Standard. (#3171)
    • SafeERC20: add safePermit as mitigation against phantom permit functions. (#3280)
    • Math: add a mulDiv function that can round the result either up or down. (#3171)
    • Math: Add a sqrt function to compute square roots of integers, rounding either up or down. (#3242)
    • Strings: add a new overloaded function toHexString that converts an address with fixed length of 20 bytes to its not checksummed ASCII string hexadecimal representation. (#3403)
    • EnumerableMap: add new UintToUintMap map type. (#3338)
    • EnumerableMap: add new Bytes32ToUintMap map type. (#3416)
    • SafeCast: add support for many more types, using procedural code generation. (#3245)
    • MerkleProof: add multiProofVerify to prove multiple values are part of a Merkle tree. (#3276)
    • MerkleProof: add calldata versions of the functions to avoid copying input arrays to memory and save gas. (#3200)
    • ERC721, ERC1155: simplified revert reasons. (#3254, (#3438))
    • ERC721: removed redundant require statement. (#3434)
    • PaymentSplitter: add releasable getters. (#3350)
    • Initializable: refactored implementation of modifiers for easier understanding. (#3450)
    • Proxies: remove runtime check of ERC1967 storage slots. (#3455)

    Breaking changes

    • Initializable: functions decorated with the modifier reinitializer(1) may no longer invoke each other.

    v4.7.0-rc.0

    This prerelease is now available for open review! Let us know your feedback and if you find any security issues.

    We have a bug bounty with rewards of up to USD $25,000 and a special POAP for submitting a valid issue.

    See the announcement for more details.

    Changelog

    Sourced from @​openzeppelin/contracts's changelog.

    4.7.1

    • SignatureChecker: Fix an issue that causes isValidSignatureNow to revert when the target contract returns ill-encoded data. (#3552)
    • ERC165Checker: Fix an issue that causes supportsInterface to revert when the target contract returns ill-encoded data. (#3552)

    4.7.0 (2022-06-29)

    • TimelockController: Migrate _call to _execute and allow inheritance and overriding similar to Governor. (#3317)
    • CrossChainEnabledPolygonChild: replace the require statement with the custom error NotCrossChainCall. (#3380)
    • ERC20FlashMint: Add customizable flash fee receiver. (#3327)
    • ERC4626: add an extension of ERC20 that implements the ERC4626 Tokenized Vault Standard. (#3171)
    • SafeERC20: add safePermit as mitigation against phantom permit functions. (#3280)
    • Math: add a mulDiv function that can round the result either up or down. (#3171)
    • Math: Add a sqrt function to compute square roots of integers, rounding either up or down. (#3242)
    • Strings: add a new overloaded function toHexString that converts an address with fixed length of 20 bytes to its not checksummed ASCII string hexadecimal representation. (#3403)
    • EnumerableMap: add new UintToUintMap map type. (#3338)
    • EnumerableMap: add new Bytes32ToUintMap map type. (#3416)
    • SafeCast: add support for many more types, using procedural code generation. (#3245)
    • MerkleProof: add multiProofVerify to prove multiple values are part of a Merkle tree. (#3276)
    • MerkleProof: add calldata versions of the functions to avoid copying input arrays to memory and save gas. (#3200)
    • ERC721, ERC1155: simplified revert reasons. (#3254, (#3438))
    • ERC721: removed redundant require statement. (#3434)
    • PaymentSplitter: add releasable getters. (#3350)
    • Initializable: refactored implementation of modifiers for easier understanding. (#3450)
    • Proxies: remove runtime check of ERC1967 storage slots. (#3455)

    Breaking changes

    • Initializable: functions decorated with the modifier reinitializer(1) may no longer invoke each other.
    Commits
    • 3b8b4ba 4.7.1
    • 212de08 Fix issues caused by abi.decode reverting (#3552)
    • 8c49ad7 4.7.0
    • 0b238a5 Minor wording fixes ERC4626 contract (#3510)
    • e4748fb Support memory arrays in MerkleTree multiproof (#3493)
    • b971092 Make ERC4626 _deposit and _withdraw internal virtual (#3504)
    • 4307d74 Add a caution note to ERC4626 about EOA access (#3503)
    • 1e7d735 Clarify PaymentSplitter shares are static
    • 029706d Fix check for generated code when last updated is a release candidate
    • 97c46a7 Output diff when test:generation fails
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump decode-uri-component from 0.2.0 to 0.2.2

    Bump decode-uri-component from 0.2.0 to 0.2.2

    Bumps decode-uri-component from 0.2.0 to 0.2.2.

    Release notes

    Sourced from decode-uri-component's releases.

    v0.2.2

    • Prevent overwriting previously decoded tokens 980e0bf

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.1...v0.2.2

    v0.2.1

    • Switch to GitHub workflows 76abc93
    • Fix issue where decode throws - fixes #6 746ca5d
    • Update license (#1) 486d7e2
    • Tidelift tasks a650457
    • Meta tweaks 66e1c28

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.1

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump @openzeppelin/contracts from 4.7.1 to 4.7.3

    Bump @openzeppelin/contracts from 4.7.1 to 4.7.3

    Bumps @openzeppelin/contracts from 4.7.1 to 4.7.3.

    Release notes

    Sourced from @​openzeppelin/contracts's releases.

    v4.7.3

    :warning: This is a patch for a high severity issue. For more information visit the security advisory.

    Breaking changes

    • ECDSA: recover(bytes32,bytes) and tryRecover(bytes32,bytes) no longer accept compact signatures to prevent malleability. Compact signature support remains available using recover(bytes32,bytes32,bytes32) and tryRecover(bytes32,bytes32,bytes32).

    v4.7.2

    :warning: This is a patch for three issues, including a high severity issue in GovernorVotesQuorumFraction. For more information visit the security advisories (1, 2, 3).

    1. GovernorVotesQuorumFraction: Fixed quorum updates so they do not affect past proposals that failed due to lack of quorum. (#3561)
    2. ERC165Checker: Added protection against large returndata. (#3587)
    3. LibArbitrumL2, CrossChainEnabledArbitrumL2: Fixed detection of cross-chain calls for EOAs. Previously, calls from EOAs would be classified as cross-chain calls. (#3578)
    Changelog

    Sourced from @​openzeppelin/contracts's changelog.

    4.7.3

    Breaking changes

    • ECDSA: recover(bytes32,bytes) and tryRecover(bytes32,bytes) no longer accept compact signatures to prevent malleability. Compact signature support remains available using recover(bytes32,bytes32,bytes32) and tryRecover(bytes32,bytes32,bytes32).

    4.7.2

    • LibArbitrumL2, CrossChainEnabledArbitrumL2: Fixed detection of cross-chain calls for EOAs. Previously, calls from EOAs would be classified as cross-chain calls. (#3578)
    • GovernorVotesQuorumFraction: Fixed quorum updates so they do not affect past proposals that failed due to lack of quorum. (#3561)
    • ERC165Checker: Added protection against large returndata. (#3587)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
Owner
Sunrit Jana
Machine learning, Full-stack developer, and DevOps engineer from India. Constantly learning and building. Building what matters. Teaching machines, how to learn
Sunrit Jana
Stacks Voice is a reference project that builds on the SIP018 signed structured data standard to create an accountless internet forum.

Stacks Voice Stacks Voice is a reference project that builds on the SIP018 signed structured data standard to create an accountless internet forum. Th

Clarity Innovation Lab 4 Dec 21, 2022
Fast and lightweight dependency-free vanilla JavaScript polyfill for native lazy loading / the awesome loading='lazy'-attribute.

loading="lazy" attribute polyfill Fast and lightweight vanilla JavaScript polyfill for native lazy loading, meaning the behaviour to load elements rig

Maximilian Franzke 571 Dec 30, 2022
Reward your community using NFTs and thirdweb's signature based minting.

Community Rewards Example Introduction In this guide, we will utilize signature-based minting of NFTs as a mechanism to reward users of a specific com

thirdweb examples 18 Jan 2, 2023
This repository shows how to implement signTypedData_4(EIP712) with NodeJS

EIP712 Implementation with NodeJS This repository shows how to implement signTypedData_4(EIP712) with NodeJS Acknowledgements What is EIP712 EIP Imple

Dapp Composer 18 Dec 17, 2022
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
NFT sales monitoring bot for the Ethereum blockchain. (ERC721, ERC1155)

Ethereum-NFT-Sales-Bot NFT sales monitoring bot for the Ethereum blockchain. (erc721, erc1155) Table of Contents Click to expand Market Coverage GIF G

null 33 Dec 13, 2022
⚡ Take a snapshot of all NFT/ERC721 collection holders. Blazing fast ⚡

⚡ Instant NFT / ERC721 Snapshot This small command line tool let's you create a blazing fast snapshot of all the owners of a NFT collection. For a 10k

Nico Elzer 38 Dec 4, 2022