问题的背景:
我正在开发一个NFT市场。在其工作流程中,管理员(智能契约的部署者)将NFT添加到市场中,当时这些NFT属于 marketplace 智能契约。
现在,当用户购买特定的NFT时,我们必须将所有权从智能契约地址转移到签名者/钱包地址。
实际问题:
在编写chai测试时,我需要调用在市场契约中编写的函数buyFromMarketplace
,它将nft的所有权转移到那里。我正在尝试连接市场智能合同地址(但我找不到任何方法),我尝试过这样做(但我知道这是行不通的)
await nft.connect(marketplace).approve(addr1.address, 0);
还试图在调用approve
之前通过调用marketplace.address
连接到NFT智能协议时发送原始地址。
在this thread中,正在做类似的事情,但在测试中却没有这样做。
而类似的事情是用ERC20令牌完成的,here。
编辑:,我找到了解决方案,并发布在答案中,也许它对未来的人有帮助!
发布于 2022-08-04 17:48:24
我觉得这不可能。然而,有一个简单的解决办法。在调用approve
函数的契约中添加一个函数。如果它只能由合同的管理员(所有者)调用,这将是有意义的。
function approveNFT(address approveFor, uint256 tokenID) external onlyOwner{
nftContract.approve(approveFor, tokenID) //assume "nftContract" is the ERC721 contract address
}
现在您可以像这样调整代码:
await nft.connect(owner).approveNFT(addr1.address, 0);
发布于 2022-08-05 05:47:03
回答我自己的问题,所以在将来,它可能会帮助到别人。
经过一番挣扎和@Tahlil的回答,我找到了解决这个问题的方法。
实际的问题是buyFromMarketplace
函数将nft的所有权从合同转移到钱包/签名者。所以我们打电话给nft.transfer
。需要的所有者/批准将其称为nft,但正如所提到的,nft属于Marketplace
合同。
实际上,在调用approve
之前,我们不需要通过调用buyFromMarketplace
市场契约地址来批准调用者的帐户。
意见:
connect
函数的以太硬帽不应该允许连接合同地址,因为我们是处理帐户那里。
事实:
它的工作原理完全一样。
https://stackoverflow.com/questions/73237625
复制相似问题