【问题标题】:Tell wether or not a mint call to a contract succeeded判断对合约的 mint 调用是否成功
【发布时间】:2022-12-19 19:47:49
【问题描述】:

我正在 NextJS 中的 NFT 网站上工作,并尝试在用户成功铸造令牌后为他们实施重定向。这是我的薄荷代码:

const mintToken = () => {
   safeMint?.();
   router.push('/success');
};

如您所见,调用safeMint 后,我尝试重定向到/success,这就是发生的情况。但是,无论铸币成功与否,它都会重定向,我希望它仅在智能合约调用成功后才重定向。我试过使用回调和超时,但似乎没有任何效果像我上面列出的那样。在重定向我丢失的内容之前,是否有某种方法可以获取或等待成功响应?谢谢!

【问题讨论】:

    标签: redirect next.js blockchain solidity smartcontracts


    【解决方案1】:

    safeMint 函数里面的合约,你可以返回 tokenId (或者你可以返回 true)

    const mintToken =async () => {
       const result=await safeMint?();
       if(result){
          router.push('/success');
       }
    };
    

    【讨论】:

      【解决方案2】:

      如果您使用事务执行函数,则函数返回值在 EVM 之外不可用。

      您可以等待交易收据。它包含事务状态(成功/恢复)以及事件日志。 Tx 收据只有在 tx 被包含在一个块中后才可用。

      根据您的 safeMint() 实现,它可能会在每次交易成功时生成令牌。但是,如果您的实现允许该功能在没有铸造令牌的情况下成功,您可能需要检查事件日志以确保 NFT 确实被铸造。

      // transaction reverted
      function safeMint() external {
          require(failedCondition);
          _mint(msg.sender, tokenId);
      }
      
      // transaction succeeded but no token was minted
      function safeMint() external {
          if (failedCondition) {
              _mint(msg.sender, tokenId);
          }
      }
      

      如何用ethers等待收据:

      const tx = await myContract.safeMint();
      const txReceipt = await transaction.wait();
      
      if (txReceipt.status) {
          // not reverted
      }
      

      文档:

      【讨论】:

        猜你喜欢
        • 2012-10-10
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        • 2015-11-08
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        相关资源
        最近更新 更多