Lazy mint от opensea что это
Перейти к содержимому

Lazy mint от opensea что это

  • автор:

Почему мы не минтим?

Как-то я удалил порядка 100 чатов (групп и каналов) в Telegram и с тех пор просматриваю не больше 10-14. Но сейчас много времени уходит на ENVELOP (NIFTSY), а потому и больше всего черпаю запросов из из Telegram & Twitter. И вот какой вопрос стал часто встречаться на пути: “а почему вы не минтите NFT-тишки сами?”. Отвечаю…

Минтинг для всех, или все на минтинг

Во-первых, если вы вдруг не в курсе, то minting переводится как чеканка и многие, намеренно или нет, путают его с майнингом: но майнинг — процесс создания нативных монет в PoW-блокчейнах, а минтинг — это генезис-стадия для NFT, то есть токенов не взаимозаменяемых.

Во-вторых, сам минтинг бывает простым: пришёл — и сделал, а также и ленивым (буквально — lazy minting): “то есть вы только готовите все к минтингу, а фактический выпуск NFT с записью в блокчейн и, соответственно, расходом газа, произойдет только если на вашу работу найдется покупатель”. Так работает OpenSea и многие другие.

В-третьих, давайте без лишних слов — обратимся к списку? Какому? Да вот этому:

  1. https://ethereum.org/en/developers/tutorials/how-to-mint-an-nft/ : можно никого и ни о чём не просить и просто сминтить всё самостоятельно на Ethereum. Вопрос усидчивости, понимания и… да, Газа конечно.
  2. https://docs.ipfs.io/how-to/mint-nfts-with-ipfs/#minty : отдельная и большая история это создания NFTs в связке с IPFS, но это, скорее, вопрос дополнительный и для, что называется, гикнутых. Скажу больше: можно это сделать даже через JS: https://dev.to/0xjepsen/how-to-mint-an-nft-with-javascript-2nci .
  3. https://www.quicknode.com/guides/web3-sdks/how-to-mint-an-nft-on-solana : для них же можно пройтись и по Solana.
  4. https://www.algorand.com/nft : впрочем, продвинутым пользователям нет смысла не делать это и на Algorand.
  5. https://docs.avax.network/build/tutorials/smart-digital-assets/creating-a-nft-part-1 : или, допустим, на Avalanche.
  6. https://opensea.io : можно минтить на Ethereum, Polygon. Плюс сейчас ещё и торговля на разных L2-решениях откроется.
  7. https://rarible.com : есть как на Ethereum (ERC-721), так и на Rari-стандарте.
  8. https://mintable.app/gasless : также можно сделать на Ethreum.
  9. https://zora.co/ : не самый известный, но маркет с минтилкой Ethereum.
  10. https://treasureland.market/#/home : место, где можно сделать всё на BSC.
  11. https://jgnnft.com/create : и вот здесь тоже на BSC.
  12. https://www.bakeryswap.org/#/home : и это BSC-сервис.
  13. https://bsc.uniqueone.photo/ : пожалуй, добавлю ещё про BSC и завершу на том для сего EVM-блокчейна.
  14. https://www.mintbase.io : минтилка необычного блокчейна Near.
  15. https://developers.cardano.org/docs/native-tokens/minting-nfts/ : вы даже можете попробовать сделать это на Cardano.
  16. https://enjin.io/products/platform : или на Enjin.

Как видим, всего полно и это только поверхностное изложение. Больше скажу: можно пойти дальше и просто выбрать подходящую игру или другой ресурс для создания конкретных персонажей, моделей и т.д.:

  1. https://www.coingecko.com/ru/nft
  2. https://coinmarketcap.com/nft/collections/
  3. ещё больше таких вещей есть в уже опубликованной статье: https://hub.forklog.com/meta-analiz-rynka-nft-proekty-problemy-perspektivy/
  4. binance.com/ru/support/faq/79dab23c7d724a069cb90dd709ecd243 : правда, если пройдёте модерацию 🙂

Вот и ответ: создать NFT можно где угодно и когда угодно. Вопрос ведь не в этом. А в чём? В том, что потом будет с вновь созданным токеном: как он будет развиваться без обеспечения или с одной продажей?

На эти вопросы уже отвечает https://envelop.is и это тема следующих исследований, а пока — до!

P.S. Если знаете крутые минтилки с API присылайте мне: ник — Menaskop почти в любой соц. сети, но лучше Telegram / Twitter.

Lazy minting

Минт NFT в большинстве блокчейнов обычно требует трат на газ. Многим до сих пор снятся эфир минты с комсой по пару k$.

Однако используя несколько методов, можно платить газ за минт в момент первой продажи. Плата происходит только в тот момент, когда нфт присваивается юзером, создателю же платить не придется, просто из цены продажи вычитается часть для оплаты газа

Минт «точно в срок» в момент покупки называют lazy mint, и данный метод был принят такими торговыми площадками, как OpenSea , чтобы снизить барьер для входа создателям NFT, позволяя создавать NFT без каких-либо предварительных затрат.(Многие уже создавали свои коллекции на ОС, не платив комиссии. Если вы этого не делали то попробуйте здесь )

В этой статье будет показан пример на Ethereum с использованием некоторых вспомогательных библиотек и базовых контрактов от OpenZeppelin .

Как это работает

Основная предпосылка ленивого минта заключается в том, что вместо непосредственного создания NFT путем вызова контрактной функции создатель NFT готовит подпись некоторых данных, используя приват кей.

Подписанные данные действуют как «ваучер» или билет, который можно обменять на NFT. Ваучер содержит всю информацию, которая войдет в фактический NFT, и он может дополнительно содержать дополнительные данные, которые не записаны в блокчейне, как мы увидим чуть позже, когда будем говорить о ценах. Подпись подтверждает, что создатель NFT санкционировал создание конкретного NFT, описанного в ваучере.

Когда покупатель хочет приобрести NFT, он вызывает функцию выкупа, чтобы выкупить подписанный ваучер. Если подпись действительна и принадлежит учетной записи, авторизованной для минта, на основе ваучера создается новый токен и передается покупателю.

В нашем примере мы используем структуру Solidity для представления нашего ваучера:

struct NFTVoucher

Создание подписанного ваучера

Использование подписей для авторизации может быть сложным, поскольку третья сторона потенциально может взять данные, которые были подписаны в одном контексте, и представить их где-то в другом месте. Как пример, они могут взять подпись, разрешающую создание NFT в тестовой сети Ropsten, и представить ее контракту, развернутому в mainnet. Если подписываемые данные не содержат какой-либо контекстной информации, этот вид «повторной атаки» довольно тривиален для выполнения и от него трудно защититься.

Чтобы устранить эти проблемы, а также обеспечить лучший пользовательский опыт при подписании сообщений, сообщество Ethereum разработало EIP-712, стандарт для подписи типизированных структурированных данных. Подписи, созданные с помощью EIP-712, «привязаны» к определенному экземпляру смарт-контракта, работающего в определенной сети. Они также содержат информацию о типе, так что такие инструменты, как MetaMask, могут предоставлять пользователю более подробную информацию о подписываемых данных вместо непрозрачной строки шестнадцатеричных символов. Однако стандарт является отличной защитой лишь он-чейн, возможность перехвата данных во время их поступления в дапп все так же остается. (Пример, когда использовали кошельки находящиеся в вайтлисте, передавали его на бек проекта и в ответ получали данные для подписи транкзации).

Мы используем класс JavaScript под названием LazyMinter для подготовки подписанных ваучеров с использованием EIP-712. Поскольку подписи привязаны к конкретному контракту, вам необходимо указать адрес развернутого контракта и ethers.js:

const lazyminter = new LazyMinter(< myDeployedContract.address, signerForMinterAccount >) async createVoucher(tokenId, uri, minPrice = 0) < const voucher = < tokenId, uri, minPrice >const domain = await this._signingDomain() const types = < NFTVoucher: [ , , , ] > const signature = await this.signer._signTypedData(domain, types, voucher) return < . voucher, signature, >>

Сначала мы готовим наш неподписанный объект ваучера и получаем домен подписи. Объект types содержит информацию о типе для полей нашего NFTVoucher (исключая саму подпись).

Чтобы создать подпись, мы вызываем метод _signTypedData для нашего объекта Signer, передавая домен, определение типа и неподписанный объект ваучера.

Наконец, мы возвращаем полный объект ваучера с включенной подписью, который можно использовать в нашем смарт-контракте.

Оплата газа при покупке

Чтобы метод работал, нам нужна функция смарт-контракта, которую может вызвать покупатель NFT, чтобы заминтить за одну транзакцию:

function redeem(address redeemer, NFTVoucher calldata voucher) public payable returns (uint256) < // make sure signature is valid and get the address of the signer address signer = _verify(voucher); // make sure that the signer is authorized to mint NFTs require(hasRole(MINTER_ROLE, signer), "Signature invalid or unauthorized"); // make sure that the redeemer is paying enough to cover the buyer's cost require(msg.value >= voucher.minPrice, "Insufficient funds to redeem"); // first assign the token to the signer, to establish provenance on-chain _mint(signer, voucher.tokenId); _setTokenURI(voucher.tokenId, voucher.uri); // transfer the token to the redeemer _transfer(signer, redeemer, voucher.tokenId); // record payment to signer's withdrawal balance pendingWithdrawals[signer] += msg.value; return voucher.tokenId; >

Сначала мы вызываем вспомогательную функцию _verify, которая либо возвращает адрес учетной записи, подготовившей подпись, либо отменяет транзакцию, если подпись недействительна.

Как только у нас есть адрес подписавшего, мы проверяем, что он авторизован для минта с помощью функции hasRole из контракта AccessControl на основе ролей OpenZeppelin .

Мы также следим за тем, чтобы покупатель отправил достаточно ETH, чтобы покрыть минимальную цену. Если это так, мы можем создать новый токен на основе информации в ваучере и перевести его на учетную запись получателя.

Наконец, мы помещаем платеж в сопоставление под названием pendingWithdrawals, чтобы создатель NFT мог позже вывести свой ETH.

Заключение

Данный способ позволяет экономить на газе, однако еще мало используем среди коллеций на евм блокчейне. Минусом данного метода является возможность для злоумышленников создавать фейк или фишинг коллекции, которые многие замечали на своих аккаунтах Opensea в разделе hidden(крайне НЕ РЕКОМЕНДУЮ взаимодействовать с данными объектами).

Что такое OpenSea

OpenSea – крупнейший маркетплейс невзаимозаменяемых токенов (NFT). Был основан Девином Финцером и Алексом Аталлахом в Нью-Йорке 20 декабря 2017 года.

При помощи OpenSea пользователи могут выпускать свои собственные NFT и выставлять их на продажу посредством прямого предложения или аукциона. OpenSea использует стандарт токенов ERC-721 на базе Ethereum, а также сеть второго уровня Polygon для ускорения транзакций и снижения комиссий.

История OpenSea

  • В 2018 году OpenSea привлекли предварительное финансирование от инкубатора Y Combinator.
  • В ноябре 2019 года OpenSea привлекли $2,1 млн венчурного капитала при участии Animoca Brands.
  • В марте 2021 года OpenSea привлекли $23 млн венчурного капитала при участии Andreessen Horowitz.
  • В июле 2021 года собрали $100 млн при оценке в $1,5 млрд.
  • В феврале 2021 года доходы маркетплейса составили $95 млн, в марте – $147 млн, а в сентябре – $2,75 млрд.
  • В сентябре 2021 года OpenSea выпустили приложение для Android и iOS. В том же месяце маркетплейс признал, что его директор был замешан в инсайдерском трейдинге. Он заранее покупал NFT, которые должны были быть опубликованы на главной странице маркетплейса, и затем продавал их после подъема цены. Вскоре его уволили.
  • В январе 2022 года OpenSea привлек $300 млн венчурного капитала при участии Paradigm и Coatue Management. В том же месяце компания приобрела проект по разработке Ethereum-кошельков Dharma Labs.

Как создать NFT на OpenSea

Создать NFT на OpenSea очень легко.

  1. Для этого на главной странице opensea.io в верхней панели рядом с профилем нажимаем на кнопку «Create».
  2. Вы попадете на страницу создания NFT. Здесь необходимо загрузить файл для NFT, указать его название и описание. Принимаются файлы формата JPG, PNG, GIF, SVG, MP4, WEBM, MP3, WAV, OGG, GLB, GLTF. Максимальный размер: 100 Мб.
  3. Вы сможете изменить параметры своего NFT в будущем, в том числе добавить его в существующую коллекцию, уточнить характеристики, уровни, статистические значения и даже прописать разблокируемый контент.

Сохранение данных NFT в децентрализованном хранилище

Вы можете навсегда записать данные своего NFT в децентрализованном хранилище, тем самым гарантировав их вечную сохранность. OpenSea не взимает комиссию за запись данных, однако вам придется заплатить комиссию за обработку транзакции.

  1. Перейдите на вкладку «My Collections», чтобы выбрать NFT;
  2. После этого активируйте раздел «Freeze metadata», переместив ползунок;
  3. Нажмите на «Freeze».

Последующий процесс может занять несколько минут. Вам будет предложено подтвердить, что все данные сохраняются в точности так, как вы этого хотите, поскольку после сохранения их уже нельзя будет изменить или удалить. Подтвердите согласие, нажав на «Submit transaction».

По умолчанию созданные с помощью OpenSea NFT будут отображаться на других платформах только после того, как они будут проданы или перемещены. До этого момента выпуск NFT в блокчейне не осуществляется. Этот процесс называется «Lazy Minting», то есть «ленивый выпуск», и позволяет пользователям создавать NFT бесплатно.

Кроме того, OpenSea позволяет выпускать так называемые взаимозаменяемые NFT, то есть несколько копий одного токена. Для этого достаточно активировать соответствующее поле, провисав ?enable_supply=true в конце адресной строки. В таком случае при выставлении NFT на продажу не забудьте указать, что вы предлагаете одну копию. Если этого не сделать, покупателю будет предложено купить все копии одновременно.

Как продать NFT на OpenSea

Готовы продать свой первый NFT на OpenSea? Тогда разберемся как.

  1. На странице opensea.io найдите изображение профиля в правом верхнем углу интерфейса, после чего нажмите на «Profile».
  2. Выберите NFT для продажи из своего кошелька. Нажмите на «Sell» в правом верхнем углу для перехода на страницу листинга.
  3. Далее вам нужно будет указать тип продажи. «Fixed Price» позволяет продать NFT по фиксированной цене. На скриншоте ниже установлена фиксированная цена в 1 ETH.
  4. Также вы можете запустить ограниченный по времени аукцион «Timed Auction». По умолчанию доступны варианты 1 день, 3 дня и 1 неделя. Вы также можете установить индивидуальный срок при помощи календаря.
  5. И наконец, вы можете зарезервировать NFT для определенного покупателя. Для этого вставьте адрес его кошелька в поле «Reserve for a specific buyer».

Для завершения продажи вас попросят подтвердить ее, подписав транзакцию. Если ранее вы еще не продавали NFT на OpenSea, вас также попросят инициализировать кошелек. Кроме того, если выпуск NFT осуществлялся не через OpenSea, а при помощи стороннего контракта, может потребоваться дополнительное подтверждение, чтобы OpenSea мог осуществить продажу токена для вас.

Как отменить предложение о продаже NFT

Чтобы снять предложение о продаже, нажмите на «Cancel listing» в правой верхней части экрана на странице соответствующего NFT. На экране появится предупреждение, где нужно будет подтвердить, что вы действительно хотите отменить листинг.

Обратите внимание, что для отмены предложения вам потребуется заплатить комиссию за обработку транзакции. Кроме того, просто перевести NFT в другой кошелек недостаточно для отмены активного предложения. Хотя в таком случае предложение исчезнет из интерфейса OpenSea, оно по-прежнему будет доступно через API. Всегда полностью отменяйте предложение, даже если это требует уплаты крупной комиссии.

Как снизить цену продажи NFT

  1. Вы можете снизить цену предложения NFT с фиксированной ценой, нажав на «Lower price» в правом верхнем углу интерфейса.
  2. Введите новую цену и подтвердите, нажав на «Set new price».

Как работает ограниченный по времени аукцион на OpenSea

На OpenSea существуют аукционы двух типов:

  1. Sell to the highest bidder – Продать по самой высокой предложенной цене;
  2. Sell with a declining price – Цена NFT будет опускаться до тех пор, пока его кто-нибудь не купит.

Продажа по самой высокой цене

На OpenSea вы можете продать свой NFT по модели классического английского аукциона, то есть покупателю, который предложит самую высокую цену. Если сумма продажи составит больше 1 ETH, OpenSea покроет связанные комиссии за обработку транзакции. Если сумма продажи составит меньше 1 ETH, продавец сам решает, принимать ли самое высокое предложение. Продавец не обязан завершать транзакцию.

Учтите, что любые предложения, сделанные в течение последних 10 минут аукциона, продлевают аукцион еще на 10 минут. Такое часто бывает с востребованными предложениями.

Вы можете отменить аукцион в любой момент, но за это придется заплатить комиссию.

Цена резервирования

При продаже через аукцион по самой высокой цене можно также установить цену резервирования (Reserve Price). Если вы не получите предложений, равных или превышающих цену резервирования, аукцион закончится без продажи.

В примере ниже стартовая цена аукциона установлена на 1 WETH, однако цена резервирования составляет 2 WETH. Цена резервирования не может быть ниже 1 ETH. Вы можете принять предложение и ниже цены резервирования в 1 ETH, но в таком случае должны будете заплатить комиссию за обработку транзакции. Цену резервирования после запуска аукциона поменять нельзя.

Продажа с падающей ценой

Продажа с падающей ценой также называется голландским аукционом. В примере ниже стартовая цена составляет 2 ETH, конечная цена – 1 ETH, срок проведения аукциона – 3 дня. Покупатель может приобрести NFT в любой момент по актуальной цене аукциона.

Как купить NFT на OpenSea

Как и продажа, механизм покупки NFT на OpenSea зависит от выбранного предложения: с фиксированной ценой или аукцион.

Как купить NFT с фиксированной ценой

Нажмите на «Buy Now» и следуйте инструкциям в кошельке. После завершения транзакции NFT будет переведен в ваш кошелек, а продавец получит оплату.

Чтобы увидеть NFT в кошельке, перейдите на страницу профиля и выберите «Collected». Учтите, что из-за задержки при обработке транзакции может пройти некоторое время, прежде чем NFT отобразится у вас в кошельке.

Как купить NFT через аукцион

Чтобы купить NFT через аукцион, нажмите на «Place Bid» возле интересующего вас лота. Обратите внимание, что ваше предложение должно по крайней мере на 5% превышать предыдущее предложение. Если вы хотите купить NFT, на который существует высокий спрос, будьте готовы перебивать предложения других участников.

Комиссии на OpenSea

На OpenSea существует два типа комиссий: взимаемые за обработку транзакций в блокчейне и взимаемые самим маркетплейсом.

Комиссии на уровне блокчейна также можно разделить на два типа: единоразовые и регулярные.

Единоразовые комиссии

К единоразовым комиссиям относятся:

  • Комиссия за инициализацию кошелька для последующей продажи NFT;
  • Предоставление разрешения контракту – если NFT был выпущен не через OpenSea, а при помощи стороннего контракта (например Bored Ape Yacht Club), вам придется заплатить эту комиссию. Кроме того, для первой продажи вам придется предоставить разрешение на взаимодействие с определенным токеном, например WETH, USDC или DAI.

Регулярные комиссии

Вы будете уплачивать комиссию на уровне блокчейна каждый раз, когда:

  • Принимаете предложение;
  • Переводите кому-то NFT;
  • Покупаете NFT;
  • Отменяете предложение о продаже;
  • Отменяете предложение о покупке;
  • Конвертируете WETH в ETH или наоборот;
  • Сохраняете метаданные в децентрализованном хранилище;
  • Переводите активы между сетями Ethereum и Polygon.

Действия без комиссий

Эти действия можно совершать без уплаты комиссий:

  • «Ленивый» выпуск NFT без регистрации в блокчейне;
  • Создание коллекции;
  • Выставление NFT на продажу;
  • Снижение цены выставленных на продажу NFT.

Комиссия OpenSea

OpenSea взимает комиссию в 2,5% с каждой транзакции, происходящей на маркетплейсе. Кроме того, можно установить сбор в пользу создателя NFT до 10%. Такой сбор взимается при каждой сделке.

Часто задаваемые вопросы

Что такое floor price?

Floor price – это минимальная цена NFT в определенной коллекции. Она обновляется в реальном времени и считается одним из основных критериев оценки той или иной коллекции рынком.

Что такое WETH?

WETH (Wrapped ETH или обернутый ETH) – валюта, используемая во многих сделках на OpenSea. Получить Wrapped ETH можно конвертировав ETH в своем профиле на OpenSea или сразу переведя из другого источника.

Как удостовериться в продаже/покупке NFT?

Данные о продаже и покупке NFT записываются в блокчейне. Чтобы убедиться в том, что сделка на OpenSea действительно состоялась, перейдите на сайт обозревателя блокчейна Etherscan и введите адрес своего кошелька.

© 2017 — 2022 «TTRCoin.com». Информационно-аналитический портал о криптовалютах, блокчейне и децентрализованных технологиях.

# Lazy minting

Minting an NFT on a blockchain mainnet generally costs some amount of money, since writing data onto the blockchain requires a fee (often called gas) to pay for the computation and storage. This can be a barrier for NFT creators, especially those new to NFTs who may not want to invest a lot of money up front before knowing whether their work will sell.

Using a few advanced techniques, it’s possible to defer the cost of minting an NFT until the moment it’s sold to its first buyer. The gas fees for minting are rolled into the same transaction that assigns the NFT to the buyer, so the NFT creator never has to pay to mint. Instead, a portion of the purchase price simply goes to cover the additional gas needed to create the initial NFT record.

Minting «just in time» at the moment of purchase is often called lazy minting, and it has been adopted by marketplaces like OpenSea

(opens new window) to lower the barrier to entry for NFT creators by making it possible to create NFTs without any up-front costs.

This guide will show an example of lazy minting on Ethereum, using some helper libraries and base contracts from OpenZeppelin

(opens new window) . If you’re new to minting NFTs in general, our minting service tutorial is a great place to get up to speed on the basics.

Throughout the guide, we’ll be referring to an example project, which lives in the NFT School examples repository

(opens new window) . If you want to dig in, clone the repo and open the example in your favorite editor:

git clone https://github.com/ipfs-shipyard/nft-school-examples cd nft-school-examples/lazy-minting code . # or whichever editor you prefer 

# How it works

The basic premise of lazy minting is that instead of creating an NFT directly by calling a contract function, the NFT creator prepares a cryptographic signature of some data using their Ethereum account’s private key.

The signed data acts as a «voucher» or ticket that can be redeemed for an NFT. The voucher contains all the information that will go into the actual NFT, and it may optionally contain additional data that isn’t recorded in the blockchain, as we’ll see in a bit when we talk about prices. The signature proves that the NFT creator authorized the creation of the specific NFT described in the voucher.

When a buyer wants to purchase the NFT, they call a redeem function to redeem the signed voucher. If the signature is valid and belongs to an account that’s authorized to mint NFTs, a new token is created based on the voucher and transfered to the buyer.

For our example, we’re using a Solidity struct

(opens new window) to represent our voucher:

struct NFTVoucher  uint256 tokenId; uint256 minPrice; string uri; bytes signature; > 

The voucher contains two pieces of information that will be recorded into the blockchain: the unique tokenId , and the uri for the token’s metadata. The minPrice is not recorded, but it is used in our redeem function to allow the creator to set a purchase price. If the minPrice is greater than zero, the buyer will need to send at least that much Ether when they call redeem .

The signature field in our struct contains a signature prepared by the NFT creator as described in the next section.

Setting a purchase price inside the voucher isn’t always necessary, but you will probably need some kind of condition. Otherwise, anyone who has the voucher could claim the NFT for just the gas cost!

For example, if you’re «air-dropping» NFTs to specific accounts and know the recipient addresses up front, your voucher could include an address recipient field instead of a minPrice , and your redeem function could check to make sure that msg.sender == voucher.recipient .

# Creating a signed voucher

Using signatures for authorization can be tricky, since a sneaky third party could potentially take some data that was signed in one context and present it somewhere else. For example, they may take a signature authorizing the creation of an NFT on the Ropsten testnet and present it to a contract deployed on mainnet. Unless the data being signed contains some context information, this kind of «replay attack» is fairly trivial to perform and hard to defend against.

To address these concerns and also provide a better user experience when signing messages, the Ethereum community has developed EIP-712

(opens new window) , a standard for signing typed, structured data. Signatures created with EIP-712 are «bound» to a specific instance of a smart contract running on a specific network. They also contain type information, so that tools like MetaMask

(opens new window) can present more details about the data being signed to the user instead of an opaque string of hex characters.

Our example uses a JavaScript class called LazyMinter to prepare signed vouchers using EIP-712. Because the signatures are bound to a specific contract instance, you need to provide the address of the deployed contract and an ethers.js Signer

(opens new window) for the NFT creator’s private key:

const lazyminter = new LazyMinter( myDeployedContract.address, signerForMinterAccount >) 

Here’s the main createVoucher method that creates signed NFT vouchers:

 async createVoucher(tokenId, uri, minPrice = 0)  const voucher =  tokenId, uri, minPrice > const domain = await this._signingDomain() const types =  NFTVoucher: [ name: "tokenId", type: "uint256">, name: "minPrice", type: "uint256">, name: "uri", type: "string">, ] > const signature = await this.signer._signTypedData(domain, types, voucher) return  . voucher, signature, > > 

First we prepare our unsigned voucher object and get the signing domain to use for EIP-712. The types object contains the type information for our NFTVoucher ‘s fields (excluding the signature itself).

To create the signature, we call the _signTypedData method on our Signer object, passing in the domain, type definition, and the unsigned voucher object.

Finally, we return the full voucher object with the signature included, which can be redeemed in our smart contract.

The _signTypedData method will be renamed to signTypedData in a future version of ethers.js! See the ethers docs for more info

# Redeeming a voucher on-chain

For lazy minting to work, we need a smart contract function that the NFT buyer can call that will both mint the NFT they want and assign it to their account, all in one transaction. Ours is called redeem :

 function redeem(address redeemer, NFTVoucher calldata voucher) public payable returns (uint256)  // make sure signature is valid and get the address of the signer address signer = _verify(voucher); // make sure that the signer is authorized to mint NFTs require(hasRole(MINTER_ROLE, signer), "Signature invalid or unauthorized"); // make sure that the redeemer is paying enough to cover the buyer's cost require(msg.value >= voucher.minPrice, "Insufficient funds to redeem"); // first assign the token to the signer, to establish provenance on-chain _mint(signer, voucher.tokenId); _setTokenURI(voucher.tokenId, voucher.uri); // transfer the token to the redeemer _transfer(signer, redeemer, voucher.tokenId); // record payment to signer's withdrawal balance pendingWithdrawals[signer] += msg.value; return voucher.tokenId; > 

First we call a _verify helper function, which either returns the address of the account that prepared the signature or reverts the transaction if the signature is invalid.

Once we have the signer’s address, we check that they’re authorized to create NFTs using the hasRole function from OpenZeppelin’s role-based AccessControl contract

We also make sure that the buyer has sent enough ETH to cover the minPrice . If so, we can create a new token based on the info in the voucher and transfer it to the redeemer account.

Finally, we tuck the payment into a mapping called pendingWithdrawals , so the NFT creator can get their ETH out later.

That’s it! If you’re curious about the signature verification, see the contract source

# Conclusion

Lazy minting is a powerful technique that can let creators issue new NFTs at no up-front cost.

Although we’ve demonstrated the core technique here, a production platform will need a lot more! For example, you’ll likely need an application for NFT creators to issue signed vouchers, and you’ll probably want some kind of back-end system to keep track of all the «un-minted» NFTs waiting to be redeemed.

Have fun building, and let us know

(opens new window) if there’s anything you’d like to see on this page that we haven’t covered!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *