首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Escrow.sol:如果您发送值,则应支付被调用的函数,并且所发送的值应小于当前余额。

Escrow.sol:如果您发送值,则应支付被调用的函数,并且所发送的值应小于当前余额。
EN

Ethereum用户
提问于 2022-06-20 12:57:53
回答 2查看 163关注 0票数 0

我正在尝试使用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

代码语言:javascript
复制
// 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

代码语言:javascript
复制
// 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);
    }
}
EN

回答 2

Ethereum用户

发布于 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智能合同:

代码语言:javascript
复制
// 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);
    }
}
票数 1
EN

Ethereum用户

发布于 2022-06-20 15:05:33

经过几次尝试,我将@Kerry99 99中的溶胶和我的原始代码组合在一起,它运行得非常完美!

func approve()已经过时了。

代码语言:javascript
复制
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);
    }
}
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/130509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档