Kiralanabilir NFT Nedir? EIP-4907 ile Kendi Kontratımızı Yazalım

Kiralanabilir NFT Nedir? EIP-4907 ile Kendi Kontratımızı Yazalım

EIP-4907 kullanarak kiralanabilir NFT yapısını basit bir akıllı kontrat oluşturarak öğreniyoruz ve kiralanabilir NFT'lerin arka plandaki çalışma mantı

·

6 min read

Günümüzde NFT’ler her geçen yıla göre daha da popülerleşti. NFT dinamiği artık yalnızca saygın koleksiyonerlerin dilinde değil; manav Ekrem amcanın, sokakta futbol oynayan Cem ve Ceren’in de dilinde.

DappRadar raporlarına göre NFT market hacmi son 10 ayda $22 milyar seviyesine ulaşmış durumda. Bu da aslında NFT’lerin yalnızca (PFP) değil, daha kritik noktalara değinmeye başladığının bir göstergesi.

Kripto endüstrisinin içindeki ve dışındaki gözlemciler için bu istatistikler akıllara durgunluk veriyor. Ancak daha da göze çarpan şey, endüstrinin henüz emekleme aşamasında olmasına rağmen, NFT’lerin hala gidecek inanılmaz bir yolu olduğu gerçeğidir.

Bu teknolojinin sağladığı olanaklar, sektöre o kadar uzun ve derin bir pist sağlıyor ki, bu pazarın sonunda ne kadar büyüyeceğini bilmek neredeyse imkansız.

Kısa bir not: Eğer sadece işin teknik tarafıyla ilgileniyorsanız. Sonraki bölümlere atlayabilirsiniz.

Kiralanabilir NFT fikri hangi sorunu çözer?

Ethereum’un ilk piyasaya çıktığı yıllarda akıllı kontrat fikri insanlara muazzam yeniliklerin geleceğinin işareti olmuştu. Blokzincir içine kod bloğu yüklemek ve blokzincire dinamizm kazandırmak olağanüstü bir durumdu. Elini taşın altına koymak isteyen geliştiriciler, akıllı kontrat çözümü için sorun aramaya başladılar ve bu bir süre devam etti.

Evet doğru duydunuz. Çözüme sorunlar aranıyordu.

Nitekim bir çoğu mantıklı sorunlardı ama yine çoğu proje ve fikir başarısız oldu. Bazen sorun ve çözümün buluşması doğru zamanda olmalıdır. Daha doğrusu çözüme sorun aranmamalıydı.

Bitcoin’in bunca yıl zirvede olmasının temel sebeplerinden biri de onun hayata temas eden bu noktasıdır.

Peki NFT marketinin bu kadar büyümesi ve gelişmesi bize nasıl sorunlar getirdi? Bir çok major NFT proje inanılmaz hacim oluşturdu ve değerlendi. Artık Bored Ape, Azuki, Doodles, CloneX gibi NFT’lere sahip olmak çok zor ve insanlar bu koleksiyonların getirdiği yan haklara sahip olmak için daha çok ödeme yapmak zorunda.

Örneğin sadece Bored Ape sahibi kullanıcılarının dahil olduğu 10.000 biletlik bir parti düşünelim. NFT’ye sahip olmasına rağmen partiye katılamayacak kullanıcılar NFT’sini belli bir süreliğine partiye gitmek isteyenlere kiralayabilir ve pasif gelir sağlayabilir.

Basitçe anlatmak gerekirse, kiralanabilir NFT fikri çok daha önce ortaya çıksa da doğru zaman değildi ve şimdi EIP4907 ile bu fikri hayata geçiriyoruz.

EIP-4907 Nedir? NFT’ye DeFi Mekanizması

EIP-4907, tüm Ethereum Improvement Proposal aşamalarını geçerek final durumuna ulaştı. Şu anda kullanımda ve eğer detaylı olarak incemelemek isterseniz buradan inceleyebilirsiniz.

İlerleyen bölümlerde kodlara beraber göz gezdireceğiz.

Andres, Lance ve Shrug tarafından yazılan ve Mart 2022 yılında yaratılan proposal, EIP-721’in uzantısı olarak kendini göstermektedir.

Hepimizin bildiği gibi sıradan NFT’lerin yalnızca bir sahibi (owner) olabilir. EIP-4907’de ise durum biraz farklı. EIP-4907’de NFT’nin sahipliğini kiralayan cüzdana vermiyoruz. Sahiplik kiralayan kişide kalmaya devam ediyor ve kiralayan kullanıcı (user) rolunu alıyor. Dolayısıyla user transfer ve listeleme gibi özelliklere erişemiyor, sadece NFT’nin haklarını kiralamış oluyor.

Ahmet ve Buse’nin bir EIP-4907 kontratı ile etkileşimi

NFT belirlenen süre içinde kontratta kalıyor ve user doNFT(kiralanan NFT’nin transfer edilemez hali) sahibi oluyor. Süre dolduğunda ise kiralama ücreti ile asıl NFT owner cüzdanına otomatik olarak geri dönüyor ve owner claim etmek için ekstra ücret ödemiyor.

Kullanımı iptal olan doNFT ise yakılıyor.

Ahmet ve Buse’nin bir EIP-4907 kontratı ile etkileşimi

Tablo ile daha iyi anlaşıldığını düşünüyorum. Şimdi IEIP-4907’nin ana fonksiyonlarına göz atalım.

Solidity Interface with NatSpec & OpenZeppelin v4 Interfaces

  • updateUser :

UpdateUser(…) eventi, bir tokenId’ye yeni bir kullanıcı atandığında, ya da bir tokenId kullanıcısı güncellendiğinde yayınlanır.

  • setUser( tokenId, user, expires):

setUser(…) fonksyonunda, verilen tokenID’ye göre kullanıcı belirili süre için atanır.

  • userOf( tokenId ) -> returns address :

userOf(…) fonksyonu view fonksyondur ve çağırıldığı an NFT’nin o anki sahibini döndürür.

  • userExpires( tokenId ) -> returns uint256:

userExpires(…) fonksiyonu da view fonksyondur ve çağrıldığı an kiralamanın biteceği süreyi döndürür.

EIP-4907 ile NFT Projemizi Oluşturalım

Bu bölümde temel seviyede IEIP-4907 kullanarak kiralanabilir NFT’lerden oluşan bir proje geliştireceğiz.

Not: Kodlar eğitim amaçlı olduğundan güvenlik açısından problemli, eksik ve ya kısmi hatalar içerebilir. Lütfen sadece temel bölümlere odaklanarak öğreniniz.

contract RentableNFT is ERC4907

İlk olarak erc4907’yi miras alarak RentableNFT adında bir kontrat oluşturuyoruz.

uint256 public rentPriceforDay = 10000000000000000; //0.01 ether

struct RentableItem {
       bool rentable;
       uint256 amountPerDay;
 }

mapping(uint256 => RentableItem) public rentables;
  • RentableItem ise tokenimizin güncel kiralama durumunu göstermektedir.

  • rentables ile NFT’lerimizi ID’lerine göre struct yapımız ile mapliyoruz.

function mint() public{

   currentTokenId.increment();

   uint256 newItemId = currentTokenId.current();

   _safeMint(whitelistmember(), newItemId);

   rentables[newItemId] = RentableItem({
         rentable: false,
         amountPerDay: rentPriceforDay
      }
   );
}

Mint fonksiyonuna zaten aşina olduğunuzu tahmin ediyorum. Fonksiyonun içindeki kiralama içeren bölümleri açıklamak gerekirse, başlangıçta mint edilen her NFT’nin rentables mapping’i ile RentableItem yapımızla maplendiğini söyleyebiliriz.

Kısacası mint edilen her NFT’nin kiralanabilir durumu false oluyor ve kiralanabilecek durumda oluyor.

ExtraNot : Lütfen fonksiyonun kimler tarafından çağırıldığına ve gerekli require durumlarına takılmayın. Sadece kiralama durumunu açıklamak istiyorum.

function setRentNFT(uint256 _tokenId, uint256 _amountPerDay) public {

   require(_isApprovedOrOwner(_msgSender(), _tokenId), 
   “Caller is not token owner nor approved”);   

   rentables[_tokenId].amountPerDay = _amountPerDay;

}

Tebrikler, tüm NFT’ler mint edildi ve hatta bir kullanıcı NFT’sini kiralamak istedi bile. NFT’sini kiralamak için setRentNFT fonksyonunu çağırdı ve başlangıçta verilen günlük kiralama bedelini değiştirdi. (Bu fonksyonu yalnızca NFT’nin sahibi çağırabilir.)

function setRentable(uint256 _tokenId, bool _rentable) public {

   require(_isApprovedOrOwner(_msgSender(), _tokenId), 
   "Caller is not token owner nor approved");

   rentables[_tokenId].rentable = _rentable;

}

Kullanıcı setRentable fonksiyonu ile tokenin kiralanabilir olma durumunu değiştirebilmektedir. (Bu fonksyonu yalnızca NFT’nin sahibi çağırabilir.)

function rent(uint256 _tokenId, uint64 _expires) public payable virtual {

   uint256 dueAmount = rentables[_tokenId].amountPerDay * _expires;

   require(msg.value == dueAmount, “Uncorrect amount”);

   require(userOf(_tokenId) == address(0), "Already rented");

   require(rentables[_tokenId].rentable, "Renting disabled for the NFT");

   payable(ownerOf(_tokenId)).transfer(dueAmount);

   UserInfo storage info = _users[_tokenId];

   info.user = msg.sender;   

   info.expires = block.timestamp + (_expires * 60);

   emit UpdateUser(_tokenId, msg.sender, _expires);

}

Asıl önemli fonksyonumuza baktığımızda bir çok ifade görüyoruz. Hadi gelin, kısaca açıklayalım.

  • İlk olarak dueAmount ile toplam bedeli belirliyoruz.

  • Sonra kiralamak isteyen kişi o bedeli karşılayabiliyor mu diye kontrol ediyoruz.

  • Daha sonra ise NFT’nin daha önce kiralanma durumunu konrol ediyoruz.

  • Kullanıcının kiralamaya izin verme durumunu da geçerliyse dueAmount miktarı owner’a ulaşılıyor.

  • User işlemleri de atanıp varsayılan süre atanır.

  • Fonksiyon tamamlanır ve emit edilir.

Bu basit örnekte sabit bir zaman dilimi belirlenmiştir. Ama tabi ki siz altyapıyı kurgulayıp daha güzel işler ortaya çıkarabilirsiniz. Ayrıca daha kapsamlı ve detaylı bir örnek için bu github adresini ziyaret edebilirsiniz.

Neden NFT kiralama platformu geliştiricisi olmayasanız ki?

(örn. sahibinden, letgo => web3 world) :)

Sonuç

Eğer buraya kadar atlamadan geldiyseniz tebrik ederim. Artık EIP-4907 hakkında daha donanımlısınız.

NFT’ler kalmak için buradalar. Her durumda, önümüzdeki yıllarda tüm endüstrileri değişen derecelerde etkileyecekler. Sonuç olarak, NFT kiralama endüstrisi, orijinal varlığın altında yatan değerden bağımsız olarak, Web3 ekonomisindeki tüm katılımcıların hemen hemen her NFT’ye erişim elde etmesini sağlayarak yükselmeye hazırdır.

NFT borç verenler, atıl olan varlıkları üzerinden kazanabilirler, NFT borçluları, belirli bir zamanda belirli bir hedefe ulaşmak için belirli varlıkları sınırlı bir süre için kaldıraç edebilir ve NFT'ler, inşa edildikleri ve kullanılmaları gerektiği şekilde kullanılacaktır ve buna hep birlikte şahit olacağız.


Yazarı sosyal medya hesaplarından takip edebilirsiniz.

Did you find this article valuable?

Support Buildchain by becoming a sponsor. Any amount is appreciated!