Security

如何為 NFT 市場交易支付版稅?

  • January 19, 2022

我已閱讀 EIP-2891,但我不知道在交易發生時處理付款的正確方法是什麼。

最初我想做這樣的事情:

(...)

   // Transfer royalties fee
   (bool success1, ) = royaltiesRecipient.call{value: royaltiesAmount}("");
   require(success1, "Royalties fee transfer failure."); // <=== this can be a problem

   // Transfer sale value to seller
   (bool success2, ) = seller.call{value: saleValue}("");
   require(success2, "Seller transfer failure.");

   // Transfer NFT buyer
   IERC721(nftContractAddress).transferFrom(address(this), buyer, tokenId);

但是,在閱讀了提款模式後,版稅的接受者可能是一份導致交易失敗的契約,因此該物品將無法在市場上銷售。

我認為提款模式在這裡不是一個好的選擇,因為版稅接收者需要不斷跟踪 NFT 的銷售時間和地點。更好的方法是嘗試進行交易,並且只有在失敗時才應用提款模式,但仍然不理想。

另一種方法可能只是刪除 require 語句,但如果交易因任何其他原因失敗,這對版稅接收者來說是不公平的。

你會如何處理它?

查看 OpenZeppelin 上的ReentrancyGuard合約。使用修飾符nonReentrant()將確保如果接收方是合約,則在完成之前將無法再次呼叫相同的函式。您不需要在這裡應用提款模式(儘管過於謹慎總是不錯的)

好的,所以我計劃做的是使用 Open Zeppelin Payment Splitter 在通過 Market Place 銷售時成為版稅的接收者。

你是說這行不通,因為接收者是契約嗎?

引用自:https://ethereum.stackexchange.com/questions/119024