微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

safeTransferFrom 不会将以太币传输到目标 ERC-721

如何解决safeTransferFrom 不会将以太币传输到目标 ERC-721

我与 ERC-721 签订了合同,并尝试用钱转移代币。我正在使用 web3.js 和 openzeppelin。因此,交易被确认,但没有资金发送到目标钱包。

这里是合约买入函数

function buy(uint256 _tokenId) public payable {
address buyer = msg.sender;

require(_isApprovedOrOwner(msg.sender,_tokenId),"ERC721: transfer caller is not owner nor approved");
approve(buyer,_tokenId);
safeTransferFrom(ownerOf(_tokenId),buyer,_tokenId); 
}

这里是 web3.js :

const buy = (2,2) => {
//Token ID: 2
//Price: 2 ether
contract.methods.buy(2).send({ from: account,value: web3.utils.toWei(2,'ether') })
}

这里是Buy Function的交易响应

{
    "transactionHash": "0xb4267ac3da9a240dc007c118f710a0c9c1fab7d9eb1fab2097acacaec1ac56ee","transactionIndex": 0,"blockHash": "0xf6b8b8456cc3ac6103f03e747e9ca92ada3b68cc86fd408e6e9e03c07d5bcc55","blockNumber": 208,"from": "0xefd8c34cf80828bd9d7b12256421b0d10d75fa86","to": "0x112c6dcedb141d2da934696bf8d6cd460eef111e","gasUsed": 83787,"cumulativeGasUsed": 83787,"contractAddress": null,"status": true,"logsBloom": "0x04000000000000000000000000000000000000000000000000000000000000000000001000000000000010000000000000000000000000000000000000200000000000000000000000000008000000000000000000000000000000000000080000000000020000000000000000000800000000000000000000000010000000000100000000000000000000000000001000000000000000000000000000000000020000000000000000000110000002000000000000000000000000000000000000000002000000000080000000000000000000000000000000000000000020000010000000000000000000000000000000000000008000000000000000200000","events": {
        "Approval": {
            "logIndex": 0,"transactionHash": "0xb4267ac3da9a240dc007c118f710a0c9c1fab7d9eb1fab2097acacaec1ac56ee","address": "0x112c6dCEDb141D2da934696BF8d6CD460EEf111e","type": "mined","id": "log_3514a43f","returnValues": {
                "0": "0xf298d44e534E465727f8E6A02F0E95Fe0d360fbC","1": "0x0000000000000000000000000000000000000000","2": "2","owner": "0xf298d44e534E465727f8E6A02F0E95Fe0d360fbC","approved": "0x0000000000000000000000000000000000000000","tokenId": "2"
            },"event": "Approval","signature": "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","raw": {
                "data": "0x","topics": [
                    "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925","0x000000000000000000000000f298d44e534e465727f8e6a02f0e95fe0d360fbc","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000002"
                ]
            }
        },"Transfer": {
            "logIndex": 1,"id": "log_95b82cfe","1": "0xEFD8C34Cf80828BD9D7B12256421b0d10d75fA86","from": "0xf298d44e534E465727f8E6A02F0E95Fe0d360fbC","to": "0xEFD8C34Cf80828BD9D7B12256421b0d10d75fA86","event": "Transfer","signature": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","topics": [
                    "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef","0x000000000000000000000000efd8c34cf80828bd9d7b12256421b0d10d75fa86","0x0000000000000000000000000000000000000000000000000000000000000002"
                ]
            }
        }
    }
}

请帮帮我。谢谢。

解决方法

我像这样改变了我的合约购买功能;

function buy(uint256 _tokenId,address payable _owner,uint256 _amount) public payable {
    address payable buyer = msg.sender; 
    address payable owner = _owner;  //<-- *payable (important)
    
    _transfer(ownerOf(_tokenId),buyer,_tokenId);
      
    owner.transfer(_amount); //<--- this function send the amount to the token owner.

}

问题解决了!
注意:这是一个简单的合同。如果你想使用,请小心。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?