将 ERC721 铸币合约转换为存储资金并接受付款

Posted

技术标签:

【中文标题】将 ERC721 铸币合约转换为存储资金并接受付款【英文标题】:Turning an ERC721 mint contract to store funds and accept payments 【发布时间】:2021-11-23 06:42:57 【问题描述】:

希望一切都好。

我一直在关注 Dapp 大学教程 (https://www.youtube.com/embed/x-6ruqmNS3o?start=2111) 来制作一个可铸造的 NFT 配对游戏。我现在正试图将合约转为对每一个新的代币铸造收取汽油费之外的一小笔费用,并将资金存储在智能合约中,以便稍后提取到个人钱包。

pragma solidity ^0.5.0;

import "./ERC721Full.sol";

contract MemoryToken is ERC721Full
 address public shopOwner;
 constructor() ERC721Full('Memory Token', 'MEMORY') public 



  function balanceOf()  public view returns(uint)
   return address(this).balance;
   

 function withdraw()  public payable 
   require(msg.sender == shopOwner, 'only shopOwner can withdraw');
   msg.sender.transfer(address(this).balance);

  

  function mint(address _to, string memory _tokenURI ) public payable 
    returns(bool)
     // require(msg.value >= 2 ether, "Not enough ETH : check price.");
     uint _tokenId= totalSupply().add(1);
     _mint(_to, _tokenId);
    _setTokenURI(_tokenId, _tokenURI);
    return true;

    
  

我已经添加了balanceOf()功能来查看积累的资金和一个withdraw()功能,仅供店主提取积累资金。此外,我已将mint() 功能转为可支付,并添加了一条要求语句以向玩家收取额外费用(0.05 以太币)。但是,当用户进行配对时(点击链接查看配对:https://www.youtube.com/embed/x-6ruqmNS3o?start=5144),收取的价格似乎只是汽油费。它也抛出以下错误。

ERC721Full中存储的mint函数如下:

function _mint(address to, uint256 tokenId) internal 
    require(to != address(0), "ERC721: mint to the zero address");
    require(!_exists(tokenId), "ERC721: token already minted");

    _tokenOwner[tokenId] = to;
    _ownedTokensCount[to].increment();

    emit Transfer(address(0), to, tokenId);

inpage.js:1 MetaMask - RPC 错误:错误:[ethjs-query] 同时格式化来自 RPC '"value":"code":-32603,"data":"message":"VM处理交易时出现异常:revert 发送的 ETH 不足:检查价格。","code":-32000,"data":"0x5cadd81f6d91f1ef5547c4c841c9788978eb5a9a590b25765081d48a824a1c99":

未捕获(承诺)

我很感激一些帮助,因为我不完全确定我修改智能合约的问题。

谢谢

【问题讨论】:

您能否展示向mint 方法发出请求的代码部分? 我已经上传了上面的_mint函数,请点击以下链接下载完整的合约以便更好地掌握(imagetoaudio.s3.amazonaws.com/ERC721Full.sol) 我不是这个意思。我想看看执行mint 方法的代码部分(可能是用javascript 编写的)。您得到的还原错误是由于 require 比较 msg.value >= 0.05 ether 导致错误。因此,问题在于执行该方法 (mint) 的那部分代码没有发送足够的以太币。 app_file.js 可以在这里下载 (imagetoaudio.s3.amazonaws.com/app_file.js)。使用的很多代码都来自 Dapp uni youtube 教程,因此了解 Solidity 合约和 app.js 文件是如何连接在一起的将是一个很好的参考。 youtube.com/embed/x-6ruqmNS3o?start=1774(合约)youtube.com/embed/x-6ruqmNS3o?start=4792(app.js 铸币功能) 【参考方案1】:

要使您的自定义更改生效,您需要做的就是将以太币与交易一起发送,只需将 value 键和希望值(以 Wei 为单位)添加到 @987654324 的参数即可实现@方法。

这里是你必须改变的功能:

  checkForMatch = async () => 
    const optionOneId = this.state.cardsChosenId[0]
    const optionTwoId = this.state.cardsChosenId[1]

    if(optionOneId == optionTwoId) 
      alert('You have clicked the same image!')
     else if (this.state.cardsChosen[0] === this.state.cardsChosen[1]) 
      alert('You found a match')
      this.state.token.methods.mint(
        this.state.account,
        window.location.origin + CARD_ARRAY[optionOneId].img.toString()
      )


      // what you have to change is this ↓ line
      .send( from: this.state.account )
      // and change it to this ↓
      .send(from: this.state.account, value: web3.utils.toWei('0.05'))


      .on('transactionHash', (hash) => 
        this.setState(
          cardsWon: [...this.state.cardsWon, optionOneId, optionTwoId],
          tokenURIs: [...this.state.tokenURIs, CARD_ARRAY[optionOneId].img]
        )
      )
     else 
      alert('Sorry, try again')
    
    this.setState(
      cardsChosen: [],
      cardsChosenId: []
    )
    if (this.state.cardsWon.length === CARD_ARRAY.length) 
      alert('Congratulations! You found them all!')
    
  

【讨论】:

谢谢,现在正在收取额外的小额费用!但是,我正在努力从智能合约中提取 0.05 以太币。非常感谢一些关于如何提取资金的指导。 部署的合约好像没有abi信息,为了交互。这是智能合约地址rinkeby.etherscan.io/address/… 您使用什么框架?重新混合 IDE?松露?布朗尼? 当我运行 truffle migrate --reset 时,合约是通过 truffle 编译的。但合约没有 MemoryToken.sol 中指定的提现机制。资金似乎卡在智能合约中(rinkeby.etherscan.io/address/… 帮助将不胜感激

以上是关于将 ERC721 铸币合约转换为存储资金并接受付款的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Flutter 与 ERC721 智能合约交互?

在测试网上部署 ERC-721 合约时,我得到了不切实际的低汽油费

ERC-721 智能合约一次铸造 2 个 NFT

基于Hardhat编写合约测试用例

ERC721:全生命周期精析,妈妈再也不用担心我不会玩NFT合约啦

什么是以太坊ERC20和ERC721