【问题标题】: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
}
文档: