Mutant Ape Yat Kulübü İnşa Et (MAYC) NFT Koleksiyon Klonu

In: Genel


Bu kılavuzda, orijinal bir koleksiyondaki kullanıcıların bir MAYC NFT’yi basmak için kullanılabilecek airdrop serumları olacağı MAYC koleksiyon drop’unun bir klonunun nasıl oluşturulacağını göstereceğiz. Kullanıcı NFT’yi talep ettiğinde, serum yakılacaktır.

Başlamadan önce, bu kılavuzda kullanacağımız araçlar hakkında daha fazla bilgi edinebileceğiniz bazı yararlı kaynaklar aşağıda verilmiştir.

Başlayalım!


Kurmak

Akıllı sözleşmeyi oluşturmak için Hardhat kullanacağız.

Hardhat, Solidity’de tam yığın geliştirme için tasarlanmış bir Ethereum geliştirme ortamı ve çerçevesidir. Basitçe söylemek gerekirse, akıllı sözleşmenizi yazabilir, dağıtabilir, testler çalıştırabilir ve kodunuzda hata ayıklayabilirsiniz.


Yeni bir kask projesi oluşturma

Hardhat projesinin ve Next.js uygulamasının gideceği bir klasör oluşturun. Bir klasör oluşturmak için terminalinizi açın ve bu komutları yürütün

mkdir mayc-clone
cd mayc-clone
Tam ekran moduna girinTam ekran modundan çık

Şimdi, yeni bir kask projesi oluşturmak için üçüncü web CLI’sini kullanacağız! Öyleyse, şu komutu çalıştırın:

npx thirdweb create --contract
Tam ekran moduna girinTam ekran modundan çık

Ne tür bir proje sorulduğunda boş bir tane seçmelisiniz!

Artık hazır bir kask projeniz var!


Ön ucu ayarlama

kullanacağım Next.js TypeScript başlangıç ​​şablonu bu kılavuz için.

Kılavuzu takip ediyorsanız, şablonla bir proje oluşturabilirsiniz. üçüncü web CLI:

npx thirdweb create --next --ts
Tam ekran moduna girinTam ekran modundan çık

Halihazırda bir Next.js uygulamanız varsa, başlamak için aşağıdaki adımları uygulamanız yeterlidir:

  • Düzenlemek @thirdweb-dev/react ve @thirdweb-dev/sdk ve ethers.

  • Siteye MetaMask kimlik doğrulaması ekleyin. Bunu takip edebilirsiniz kılavuz metamask auth eklemek için.


Akıllı Sözleşmeler Oluşturma


Akıllı sözleşmelerin yazılması


BAYClone.sol

Artık akıllı sözleşmelerimizi yazacağız! Yeni bir dosya oluştur BAYClone.sol içinde contracts dosya. Yeni bir NFT düşüşü oluşturmak için üçüncü web sözleşmeleri genişletme özelliğini kullanacağız. Yani, aşağıdakini içine yapıştırın

// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;

import "@thirdweb-dev/contracts/base/ERC721Drop.sol";

contract BAYClone is ERC721Drop {
    constructor(
        string memory _name,
        string memory _symbol,
        address _royaltyRecipient,
        uint128 _royaltyBps,
        address _primarySaleRecipient
    )
        ERC721Drop(
            _name,
            _symbol,
            _royaltyRecipient,
            _royaltyBps,
            _primarySaleRecipient
        )
    {}
}
Tam ekran moduna girinTam ekran modundan çık

Burada ithal ediyoruz ERC721Drop üçüncü web sözleşmeleri paketinden sözleşme. Bu sözleşme, yeni bir NFT düşüşü oluşturmamıza izin veren temel bir sözleşmedir. Ayrıca inşaatçıya isim, sembol, telif hakkı alıcısı, telif bps’si ve birincil satış alıcısını iletiyoruz.


SerumClone.sol

Ardından, serumun toplanması olacak yeni bir sözleşme oluşturacağız. Bu bir ERC1155 sözleşmesi olacaktır. Yeni bir dosya oluştur SerumClone.sol içinde contracts dosya. Yeni bir ERC1155 koleksiyonu oluşturmak için üçüncü web sözleşmeleri genişletme özelliğini de kullanacağız. Yani, aşağıdakini içine yapıştırın

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@thirdweb-dev/contracts/base/ERC1155Base.sol";

contract SerumClone is ERC1155Base {
    constructor(
        string memory _name,
        string memory _symbol,
        address _royaltyRecipient,
        uint128 _royaltyBps
    ) ERC1155Base(_name, _symbol, _royaltyRecipient, _royaltyBps) {}
}
Tam ekran moduna girinTam ekran modundan çık

Burada, tıpkı BAYC Klonu gibi, üçüncü web sözleşmeleri paketinden bir temel sözleşmeyi genişletiyoruz. Bu sefer uzatıyoruz ERC1155Base sözleşme. Yapıcıya isim, sembol, telif hakkı alıcısı ve telif bps’sini de iletiyoruz.


MAYClone.sol

Son olarak en önemli sözleşmemiz olan MAYC Klonumuzu yazacağız. Burada ERC721Drop sözleşmesini genişleteceğiz ve bazı ekstra işlevler ekleyeceğiz. Yeni bir dosya oluştur MAYClone.sol içinde contracts dosya. içine şunu yapıştır

// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.0;

import "@thirdweb-dev/contracts/base/ERC721LazyMint.sol";
import "@thirdweb-dev/contracts/base/ERC1155Base.sol";
import "@thirdweb-dev/contracts/base/ERC721Drop.sol";

contract MAYClone is ERC721LazyMint {
    // Store constant values for the 2 NFT Collections:
    // 1. Is the BAYC NFT Collection
    ERC721LazyMint public immutable bayc;
    // 2. Is the Serum NFT Collection
    ERC1155Base public immutable serum;

    constructor(
        string memory _name,
        string memory _symbol,
        address _royaltyRecipient,
        uint128 _royaltyBps,
        address _baycAddress,
        address _serumAddress
    ) ERC721LazyMint(_name, _symbol, _royaltyRecipient, _royaltyBps) {
        bayc = ERC721LazyMint(_baycAddress);
        serum = ERC1155Base(_serumAddress);
    }
}
Tam ekran moduna girinTam ekran modundan çık

Burada uzatıyoruz ERC721LazyMint sözleşme. Ayrıca yapıcı argümanları olarak BAYC ve Serum sözleşme adreslerini de alıyoruz. Şimdi, sözleşmeye ekstra işlevleri ekleyelim!

 function verifyClaim(address _claimer, uint256 _quantity)
        public
        view
        virtual
        override
    {
        // 1. Override the claim function to ensure a few things:
        // - They own an NFT from the BAYClone contract
        require(bayc.balanceOf(_claimer) >= _quantity, "You don't own enough BAYC NFTs");
        // - They own an NFT from the SerumClone contract
        require(serum.balanceOf(_claimer, 0) >= _quantity, "You don't own enough Serum NFTs");
    }

    function transferTokensOnClaim(address _receiver, uint256 _quantity) internal override returns(uint256) {
        serum.burn(
            _receiver,
            0,
            _quantity
        );

        // Use the rest of the inherited claim function logic
      return super.transferTokensOnClaim(_receiver, _quantity);
    }
Tam ekran moduna girinTam ekran modundan çık

doğrulamaClaim işlevi, kullanıcının yeterli sayıda BAYC ve Serum NFT’sine sahip olup olmadığını kontrol eder. transferTokensOnClaim işlevi, kullanıcıdan Serum NFT’lerini yakar ve ardından devralınan transferTokensOnClaim işlevini çağırır.

Artık akıllı sözleşmelerimizi yazdığımıza göre, devam edip sözleşmemizi kullanarak dağıtacağız. dağıtmak.


Sözleşmeleri dağıtma

npx thirdweb deploy
Tam ekran moduna girinTam ekran modundan çık

Bu komut, RPC URL’lerini ayarlamak, özel anahtarları dışa aktarmak ve komut dosyaları yazmak gibi tüm projenizi kurmanın zahmetli sürecinden kaçınmanıza olanak tanır. Şimdi, hangi sözleşmenin dağıtılacağını seçmek için seçenekler alacaksınız. Üçünü de konuşlandırmamız gerekiyor, böylece onları birer birer konuşlandıracağız.

Dağıtmak


BAYKlon

İlk olarak, BAYC Clone sözleşmesini dağıtalım. Formu değerlerinizle doldurduktan sonra BAYC Clone sözleşmesini seçin. Sözleşmeyi dağıtın!

BAYÇ

Şimdi, sözleşmenizi dağıtmak istediğiniz ağı seçin! Ben Goerli kullanacağım ama sen hangisini istersen onu kullanabilirsin. Ağınızı seçtikten sonra üzerine tıklayın. Deploy now!

İşlemler mayınlandıktan sonra birçok seçenekten oluşan panoya yönlendirileceksiniz. Onları keşfetmekten çekinmeyin, ancak şimdilik diğer sözleşmelerle devam edeceğiz!


SerumKlon

Şimdi SerumContract’ı BAYC Clone sözleşmesi için yaptığınız gibi dağıtın.


MAYKlon

Son olarak, MAYC Clone sözleşmesini dağıtın. Dağıtım işlemi BAYC klonu ve Serum Klonu ile aynı olacaktır ancak bu iki adresi de geçmeniz gerekir!


BAYC Klonundan NFT Basma

İnsanların NFT’lerimizi talep edebilmeleri için bir talep aşaması kurmamız gerekiyor. Test için de kendimize bir tane talep edeceğiz. Talep Koşullarına gidin ve ihtiyacınız olan parametrelerle yeni bir talep aşaması oluşturun!

Talep Koşulları

Şimdi, NFT’ler sekmesine gidin. Kullanıcıların basması için bazı NFT’leri toplu olarak yükleyelim. Bu kılavuz için kullanacağım Şekiller toplu yükleme örneği.

Toplu yüklemeye tıklayın ve görüntüleri ve CSV/JSON dosyasını yükleyin.

Yüklendikten sonra NFT’leri görebileceksiniz! Toplu yükleme hakkında daha fazla bilgi edinmek için kontrol edin bu kılavuz.

Şimdi, süreci test etmek için bazı NFT’ler talep etmemiz gerekiyor. Gezgin sekmesine gidin ve talep seçeneğine tıklayın. Şimdi, aşağıdaki değerleri kullandığım verileri doldurun:

  • _alıcı: 0x477856f90EdE4D4669f222889947bE5EE43424Db
  • _Miktar: 2
  • _para birimi: 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  • _pricePerToken: 0
  • _allowlistProof: { “kanıt”: [“0x0000000000000000000000000000000000000000000000000000000000000000″]”maxQuantityInAllowlist”: 0 }
  • _veri: []
  • Yerel Simge Değeri: 0

NFT talebinde bulunun

Yürüt’e tıklayın ve işlemi onaylayın. Şimdi, NFT’lerin talep edildiğini görebilirsiniz!


MAYC Clone’dan Airdropping NFT’ler

BAYC koleksiyonunun sahiplerine airdrop olarak gönderilecek bir erc 1155 jetonu eklememiz gerekiyor, bu yüzden NFT’ler sekmesine gidin ve mint’e tıklayın. Ayrıntıları doldurun ve Nane’ye tıklayın!

Serumları havadan indirmek için BAYC NFT’lerin tüm sahiplerini alacak ve ondan bir CSV dosyası oluşturacak bir komut dosyası oluşturacağız. Sonra bu CSV dosyasını serumları airdrop için kullanacağız. Yani, bizim içinde application klasörü, adlı yeni bir dosya oluşturun. scripts/getAll.mjs ve aşağıdakileri ekleyin:

import { ThirdwebSDK } from "@thirdweb-dev/sdk";
import fs from "fs";
import path from "path";

(async () => {
  const sdk = new ThirdwebSDK("goerli");
  const contract = await sdk.getContract(
    "0x3714e40A15Deffb8E43A58b018bD81C2c6AC2445"
  );

  if (!contract) {
    return;
  }

  const nfts = await contract?.nft?.query?.all();

  if (!nfts) {
    return;
  }

  const csv = nfts?.reduce((acc, nft) => {
    const address = nft.owner;
    const quantity = acc[address] ? acc[address] + 1 : 1;
    return { ...acc, [address]: quantity };
  }, {});

  const filteredCsv = Object.keys(csv).reduce((acc, key) => {
    if (key !== "0x0000000000000000000000000000000000000000") {
      return {
        ...acc,
        [key]: csv[key],
      };
    }
    return acc;
  }, {});

  const csvString =
    "address,quantity r" +
    Object.entries(filteredCsv)
      .map(([address, quantity]) => `${address},${quantity}`)
      .join("r");

  fs.writeFileSync(path.join(path.dirname("."), "nfts.csv"), csvString);
  console.log("Generated nfts.csv");
})();
Tam ekran moduna girinTam ekran modundan çık

Sözleşme adresinizi güncelleyin ve betiği çalıştırın. yenisini göreceksin nfts.csv dosya şöyle:

address,quantity
0xb371d1C5629C70ACd726B20a045D197c256E1054,1
Tam ekran moduna girinTam ekran modundan çık

CSV dosyanızı güncellemeyi/kontrol etmeyi tamamladığınızda, kontrol paneline geri dönün ve NFT’nize tıklayın. Airdrop sekmesine gidin ve adreslerinizi yükleyin. Bittiğinde, konuşlandır’ı tıklayın ve serumlar adreslere hava yoluyla bırakılacak!


MAYC Klonuna NFT Ekleme

BAYC Klonuna NFT’leri eklediğimiz gibi, NFT’leri de MAYC klonuna eklememiz gerekiyor.


Ön ucu oluşturma

Şimdi, insanların MAYC NFT’lerini talep edebilmesi için önyüzümüzü oluşturalım! Kodumuzu temiz tutmak için mayc ve serum adreslerini değişken olarak saklayacağız. const/contractAddresses.ts:

export const MAYC_ADDRESS = "0xE0e3fd6782a3b87aB1bab5d78CDAF75cB453BCbe";
export const SERUM_ADDRESS = "0xDAcd1CDB5A144fC6fa3c55F290be778Ca47C5187";
Tam ekran moduna girinTam ekran modundan çık

Şimdi pages/index.tsx kullanacağız Web3Button kullanıcıların NFT’yi talep etmesine izin veren bileşen:

return (
  <div>
    <Web3Button
      contractAddress={MAYC_ADDRESS}
      action={(contract) => mintMutantNft(contract)}
    >
      Mint Your Mutant NFT
    </Web3Button>
  </div>
);
Tam ekran moduna girinTam ekran modundan çık

MAYC_ADDRESS, sözleşme Adresleri dosyamızdan içe aktarılacaktır. Ve gördüğünüz gibi bir fonksiyonumuz da var. mintMutantNft öyleyse şunu oluşturalım:

const mintMutantNft = async (maycContract: SmartContract<BaseContract>) => {
  // 1. Check the approval of the mayc contract to burn the user's serum tokens
  const hasApproval = await serumContract?.call(
    "isApprovedForAll",
    address,
    maycContract?.getAddress()
  );
  const balance = await serumContract?.call("balanceOf", address, 0);

  if (!hasApproval) {
    // Set approval
    await serumContract?.call(
      "setApprovalForAll",
      maycContract?.getAddress(),
      true
    );
  }

  if (balance < 1) {
    return alert("Not enough serum tokens");
  }

  await maycContract?.call("claim", address!, 1);
};
Tam ekran moduna girinTam ekran modundan çık

Burada serum Sözleşmesini alıyoruz ve sözleşmenin serumu yakması gerektiğinden önce onay istiyoruz. Adresi ve maycContract’ı almak için bazı kancalar kullanacağız:

const address = useAddress();
const { contract: serumContract } = useContract(SERUM_ADDRESS);
Tam ekran moduna girinTam ekran modundan çık

Şimdi, uygulamamızı test edersek her şey işe yarıyor! 🥳


Çözüm

Bu kılavuzda, bir MAYC klonu oluşturmak için taban uzantılarının nasıl kullanılacağını öğrendik. Dapp pat’ı kendi sırtınıza kurduysanız ve bizimle üçüncü web anlaşmazlığı! Kodu incelemek isterseniz, GitHub Deposu.

Bir cevap yazın

Ready to Grow Your Business?

We Serve our Clients’ Best Interests with the Best Marketing Solutions. Find out More

How Can We Help You?

Need to bounce off ideas for an upcoming project or digital campaign? Looking to transform your business with the implementation of full potential digital marketing?

For any career inquiries, please visit our careers page here.
[contact-form-7 404 "Bulunamadı"]