Security
如何為 NFT 市場交易支付版稅?
我已閱讀 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 銷售時成為版稅的接收者。
你是說這行不通,因為接收者是契約嗎?