İlk NFT 2.0’ımızı Üretelim

önce yayınlandı , Son güncelleme önce

Okuma Süresi: 4 dk

Paylaş:

NFT rüzgarı esmeye devam ederken gündeme Soulbound NFT’ler geldi. Buna kimi zaman NFT 2.0 dense de henüz bu tartışmalı bir konu. Biz yine de biraz da dikkatinizi çekmek için bu ibareyi kullanalım.

NFT konusunda bir şey dikkatinizi çekmiştir. Mesele kripto paranın çok ötesinde. İnsanlar NFT ile dijital kimliklerinin bir parçasını oluşturuyorlar. Bazen mutluluk bazen ego satın alıyorlar. Bu durum Vitalik Buterin’in de dikkatinden kaçmamış olacak ki bir yazı kaleme alıp Devredilemez NFT’leri yani Soulbound NFT’leri duyurdu. Her gün yeni bir şey çıkıyor dediğinizi duyar gibiyim. Doğrudur, 11 yıllık bir teknolojinin 402 kere “vefat” haberi çıkınca bir hayli çok canlı oluyor. Her gün de yeni bir doğum yapıyor.

Soulbound yani devredilemez NFT’lerin neden ortaya çıktığı nerelerde kullanılabileceği ayrı bir konu. Bunla ilgili yakında bir yazı gelecek. Ondan önce, gelin teknik olarak nasıl üretildiğine göz atalım.

Hadi başlayalım.

İlk olarak bir ERC721 kontratına ihtiyacımız var. Amerikayı baştan keşfetmeye gerek yok. https://wizard.openzeppelin.com/ adresine giriyoruz. Üst taraftan ERC721’i seçip aşağıdaki şekilde Mintable, Auto Increment Ids, URI Storage kısımlarını aktif yapıyoruz.

İlk NFT 2.0'ımızı Üretelim

Sağ üst köşeden Open in Remix diyoruz ve kodumuz aşağıdaki şekilde oluşuyor:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;import "@openzeppelin/[email protected]/token/ERC721/ERC721.sol";
import "@openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/[email protected]/access/Ownable.sol";
import "@openzeppelin/[email protected]/utils/Counters.sol";contract SoulBoundTest is ERC721, ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;Counters.Counter private _tokenIdCounter;constructor() ERC721("SoulBoundTest", "SBT") {}function safeMint(address to, string memory uri) public onlyOwner {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }// The following functions are overrides required by Solidity.function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }}

Harika. Şimdi ise ikame edilemez jetonlarımızı devredilemez yapalım. Bunun için bizim bir fonksiyona ihtiyacımız var. Bizim kullandığımız Open Zeppelin kütüphanesi içinde _beforeTokenTransfer fonksiyonu var.

function _beforeTokenTransfer(
address from, 
address to, 
uint256 tokenId
) internal override virtual {
require(from == address(0), "Err: Token transfer edilemez.");   
super._beforeTokenTransfer(from, to, tokenId);  
}

Bu fonksiyonu kontratın içine giriyoruz. Kodumuzun son hali şu şekilde oluyor.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@openzeppelin/[email protected]/token/ERC721/ERC721.sol";
import "@openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/[email protected]/access/Ownable.sol";
import "@openzeppelin/[email protected]/utils/Counters.sol";
contract SoulBoundTest is ERC721, ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
constructor() ERC721("SoulBoundTest", "SBT") {}
function safeMint(address to, string memory uri) public onlyOwner {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }
// The following functions are overrides required by Solidity.
function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }
function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
function _beforeTokenTransfer(
address from, 
address to, 
uint256 tokenId
) internal override virtual {
require(from == address(0), "Err: Token transfer edilemez.");   
super._beforeTokenTransfer(from, to, tokenId);  
}
}

Bu kod her çalıştığında, require ifadesi ile tokenın gönderilip gönderilemeyeceği kontrol ediliyor ve bir tür bloklama yapılıyor. Şimdi kontratımızı ağa yayalım. Metamask kullanıyoruz ve Moonbeam ağı üzerinden bağlantımızı yapıyoruz.

1 uUUWE2vrNrVnUvQsAhp8DQ

Deploy tuşuna bastık ve kontratımızı yayınladık. Buradan kontrol edebilirsiniz.

Şimdi bu kontratı kullanarak Souldbound NFT üretme kısmına geçelim. İstersek explorer üzerinden kontratı doğrulayarak devam edebiliriz fakat biz daha pratik olduğu için Remix üzerinden işlemi yapacağız.

1 bj8VsxT3oGFd9 dVNkATg 1

Bizim iki parametreye ihtiyacımız var. Bunlardan ilki to ve ikincisi URI adresi. Aşağıda görüldüğü şekilde safeMint fonksiyonuna bunları girerek ağa göndereceğiz.

1 AWvD9HNXTvC 7msv0Jb9Qw

To kısmına adres gelecek, biliyoruz. URI kısmı için de dosyalarımızı yüklediğimiz bir IPFS bulutu lazım. Bunun için Pinata platformunu kullanıyoruz. Pinata NFT’leri saklamak için bir platform.

İlk olarak https://gateway.pinata.cloud/ipfs adresine giriş yaparak medya dosyamızı yüklüyoruz.

Buradaki CID kısmı bizim için önemli.

1 QxYARetRlfPLHlmfiOvBzQ

Bu adresi de alıp aşağıdaki şekilde bir JSON dosyası oluşturuyoruz. Detayları değiştirebiliriz.

{
    "attributes" : [ {
      "trait_type" : "NFT",
      "value" : "Soulbound"
    }, {
      "trait_type" : "Asset",
      "value" : "Non-transferable Badge"
    }, {
        "trait_type" : "Badge",
        "value" : "Minting First Soulbound Token"
      }, {
        "trait_type" : "Type",
        "value" : "Demo"
      }   ],
    "description" : "This is a demo soulbound token mint",
    "image" : "https://gateway.pinata.cloud/ipfs/QmZASW365tuDTjuJuQs36os8tku6vVPcvvV1BjtqPMNg59",
    "name" : "Soulbound Token"
}

CID kısmı JSON dosyamızda linkin sonuna geldi. Şimdi bu JSON dosyasını bir klasör içinde IPFS’e yükleyelim. Klasöre girince aşağıdaki şekilde JSON dosyamızı görebiliyoruz.

1 TXkqo8N VVfvGK zWnU2Mg

Aşağıdaki adresini kopyalıyoruz. Bu bizim URI adresimiz oluyor.

https://gateway.pinata.cloud/ipfs/QmdgmWoscdfiCbjdm4QYMsrwkmSzmPJ2PLgYK9cWKnLmRx/soulbond.json

1 5C MT5brvO i3C2j2TwqJw
1 05a53f2SeOiq52kyEcw ig

İşte bu kadar devredilemez NFT’mizi ürettik. Buradan kontrol edebilirsiniz.

Taşınamaz NFT’mize NFT Marketplace üzerinden buradan bakabiliriz.

Bu makale yatırım tavsiyesi veya önerisi içermemektedir. Her yatırım ve alım satım hareketi risk içerir ve okuyucular karar verirken kendi araştırmalarını yapmalıdır.

bugraayan

Yazar: Buğra Ayan

Piyasalar dipte mi? Derinlemesine bir analiz

ABD hisse senetleri düşüyor, Bitcoin düşüyor, altcoin’ler daha da düşüyor. Bu haftaki yazımda düşüş trendinin sonuna gelinip gelinmediğini inceleyeceğim. Bolca grafik yorumladıktan sonra bir puanlama yaparak dip seviyelere ne kadar yakın olduğumuzu tahmin etmeye çalışacağım. Gümrük vergileri Trump’ın ilk döneminde limitli bir gümrük vergisi politikası vardı. Örneğin bu yaptırımlar 800 doların altında değeri olan ürünleri ...

Bağlantıyı kopyala