我正在尝试使用Escrow.sol令牌来实现ERC20。当我在Remix上部署Escrow.sol并想要存放10个令牌时,The called function should be payable if you send value and the value you send should be less than your current balance.就会显示出退出的功能。
我怎么才能修好它?
下面是我的erc20.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor() ERC20("GINWEI", "GW") public payable {
_mint(msg.sender, 1000);
}
}下面是escr.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
import "./erc20.sol";
contract MyEscrow {
mapping(address => mapping(address => uint256)) public _deposits;
address payable payee = payable(msg.sender);
MyToken token;
function deposit(uint256 amount) public payable {
token.approve(address(this), amount);
token.transfer(address(this), amount);
_deposits[payee][address(token)] += amount;
}
function depositsOf() public view returns (uint256) {
return _deposits[payee][address(token)];
}
function withdraw(uint256 payment) public payable {
_deposits[payee][address(token)] -= payment;
payee.transfer(payment);
}
}发布于 2022-06-20 14:17:46
您的MyEscrow智能合同有任何问题,让我解释一下:
MyToken token;类似于存储变量时,必须使用ERC20 20‘S智能联系人地址实例化它,以便使用ERC20方法。如何解决此问题的示例:MyToken token = MyToken([addressERC20SmartContract]);token.approve(address(this), amount);这个声明是错误的,因为您正在批准您的MyEscrow智能合同来传输它没有的令牌数量。要解决这个问题,用户必须从您的approve()智能契约(本例中为MyToken智能契约)调用D9。调用approve时,必须在以下参数内传递这些值:MyEscrow智能合同地址;MyEscrow可以从您的钱包转移。withdraw函数中,将ERC20从智能契约转移到用户钱包中,您可以使用transfer() ERC20方法,并在其中传递msg.sender和要提取的值。我已经以这样的方式更正了您的MyEscrow智能合同:
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
import "./erc20.sol";
contract MyEscrow {
mapping(address => mapping(address => uint256)) public _deposits;
address payable payee = payable(msg.sender);
MyToken token;
constructor(address _myToken) {
token = MyToken(_myToken);
}
function deposit(uint256 amount) public payable {
token.transferFrom(msg.sender, address(this), amount);
_deposits[payee][address(token)] += amount;
}
function depositsOf() public view returns (uint256) {
return _deposits[payee][address(token)];
}
function withdraw(uint256 payment) public payable {
_deposits[payee][address(token)] -= payment;
token.transfer(msg.sender, payment);
}
}发布于 2022-06-20 15:05:33
经过几次尝试,我将@Kerry99 99中的溶胶和我的原始代码组合在一起,它运行得非常完美!
func approve()已经过时了。
contract MyEscrow {
mapping(address => mapping(address => uint256)) public _deposits;
address payable payee = payable(msg.sender);
address tokenaddress = 0x...;
MyToken token = MyToken(tokenaddress);
function deposit(uint256 amount) public payable {
token.approve(msg.sender, address(this), amount);
token.transferFrom(msg.sender, address(this), amount);
_deposits[payee][tokenaddress] += amount;
}
function depositsOf() public view returns (uint256) {
return _deposits[payee][tokenaddress];
}
function withdraw(uint256 payment) public payable {
_deposits[payee][tokenaddress] -= payment;
token.transfer(msg.sender, payment);
}
}https://ethereum.stackexchange.com/questions/130509
复制相似问题