0

我有一个 openZeppelin ERC721 NFT 合约 (MyNFTPrice.sol) 和一个单独的 PaymentSplitter 合约。我的理解是这两个合约需要单独部署。我的问题是,如何将铸币价格从我的 NFT 合约 (MyNFTPrice.sol) 发送到 PaymentSplitter 合约?目前,铸造 NFT 的价格位于 MyNFTPrice.sol 合约地址中。

MyNFTPrice.sol

 pragma solidity ^0.8.0;

 import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
 import "@openzeppelin/contracts/utils/Counters.sol";
 import "@openzeppelin/contracts/access/Ownable.sol";
 import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";

contract MyNFTPrice is ERC721URIStorage {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;

constructor() public ERC721("MyNFTPrice", "NFTPRICE") {}


// Mint new NFT
function mintNFT(address recipient, string memory tokenURI) public payable  {

    require(msg.value >= 50000000000000000, "You need 0.05 ETH to mint the NFT"); 

    _tokenIds.increment();

    uint256 newItemId = _tokenIds.current();
    _mint(recipient, newItemId);
    _setTokenURI(newItemId, tokenURI);

}
}
4

1 回答 1

0

您可以使用.address payable

function mintNFT(address recipient, string memory tokenURI) public payable  {
    require(msg.value >= 50000000000000000, "You need 0.05 ETH to mint the NFT");

    // effectively redirects the `msg.value` to the `0x123` address
    payable(address(0x123)).transfer(msg.value);

    // ... rest of your code
}

将 替换0x123为 的真实地址PaymentSplitter

您还可以将地址存储在变量中,并在需要时进行更改。在这种情况下,建议使用授权机制,例如Ownable模式,这样只有授权的发送者才能更改值。


由于PaymentSplitter是一个合约,它需要包含receive()fallback() payable函数。否则,PaymentSplitter作为接收方的人将拒绝收到的付款并有效地导致整个mintNFT()交易恢复。

contract PaymentSplitter {
    receive() external payable {
        // can be empty
    }
}
于 2021-09-21T12:30:10.130 回答