当前位置: 首页 > 知识库问答 >
问题:

ERC20代币转移到智能合约

黄永怡
2023-03-14

嗨,我已经编写了一个简单的智能合约,将erc20令牌从用户转移到智能合约,并从智能合约转移到用户。我在调用transferFrom函数之前批准了它,但事务失败。我试过只打电话给approve,而不打电话给transferFrom。它很管用。我正在林克比测试网上测试。

// SPDX-License-Identifier: MIT
pragma solidity =0.7.6;
pragma abicoder v2;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

}

contract transferToContract {
    address public _WETH = 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984;
    IERC20 public WETH = IERC20(_WETH);

    function transferToC (uint amount) public
    {
        WETH.approve(msg.sender,amount);
        WETH.transferFrom(msg.sender,address(this),amount);
    }
    
    function transferFromC(uint amount) public{
        WETH.approve(address(this),amount);
        WETH.transferFrom(address(this),msg.sender,amount);
    }
    
    function getbal() public view returns(uint){
        return WETH.balanceOf(msg.sender);
    }
    
    
}

我在测试注入了web3的混音。我得到的错误是

Gas estimation errored with the following message (see below). The transaction execution will likely fail. Do you want to force sending?
execution reverted: Uni::transferFrom: transfer amount exceeds spender allowance { "originalError": { "code": 3, "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003c556e693a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e636500000000", "message": "execution reverted: Uni::transferFrom: transfer amount exceeds spender allowance" } }

此外,我在 rinkeby 测试网上的测试钱包中有令牌,我正在使用注入的 remix web3 进行部署。

共有2个答案

孟文栋
2023-03-14

我希望我的合同接受来自外部帐户的令牌,这些令牌很少(可以是任何令牌,但基于ERC20)。因此,要直接调用approve函数,我需要创建令牌契约的实例,那么我如何使用web3创建实例呢?

任何代码段都会有帮助,如果您可以共享指向任何文档的链接,同样也会有帮助。

姜阳
2023-03-14
WETH.approve(msg.sender,amount);

此行批准用户使用合同的令牌。反之亦然。

如果您希望批准合同以操作用户的令牌,用户需要直接在WETH合同上执行< code > approve(yourcontracaddress,amount)(不通过您的合同)。

我在另一个答案中也提到了类似的话题。TLDR部分也与您的问题相关:https://stackoverflow.com/a/67642090/1693192

 类似资料:
  • 我的目标是创建一个智能合约,用户可以使用该合约存入erc20并提取erc20代币。我尝试使用token transfer实现此功能,transferfrom函数尝试将令牌发送到合约地址。但它显示了一些错误。我尝试了互联网上所有可能的解决方案,但没有运气。请帮助我######################################## 在此输入图像描述 在此输入图像描述 当我试图转移使用保存

  • 我正在尝试构建一个智能合约并继承一些功能来交换ERC20代币, 这是我的问题? 问题A:是否可以将ERC20令牌转移到智能合约余额?,请提供一个示例,即我们可以创建一个将ETH发送到智能合约的功能 问题B:如果A是可能的,如何获得合约的代币余额?即,我们可以从以下函数获得合约ETH余额: 问题 C: 如果“A”是可能的,如何使用Uniswap或Sushiswap API与BAND/ETH流动性池进

  • 最近,我在处理具有质押功能的智能合约时遇到了一个问题。通过IERC20界面,我设法与来自另一个合约的Erc20令牌进行交互,但仍然存在一个混乱。我正在开发一个智能合约,用户可以在智能合约中抵押我的代币(代币已经部署在网络中),当质押持续时间结束时,利益相关者可以获得他们的质押金额以及奖励的代币。对于奖励代币,我想铸造新的代币,以奖励我的智能合约中的利益相关者。如何在另一个智能合约中使用薄荷功能?我

  • 我正在尝试在Binance智能链网络上部署测试契约。我正在使用metamask和truffle来创建和测试合同。我的文件夹结构如下所示 块菌部署错误 我已经附上了所有我面临的错误代码。有人能帮我吗?我还安装了高清钱包提供商。块菌编译成功。

  • 指导编写一个EOSIO的智能合约 模块 Account API 查询账户数据的API. Chain API 查询链内部状态的API. Database API 存储和检索EOS.IO区块链的数据API根据以下广泛结构来组织数据. Math API 定义常用的数学函数. Action API 定义用于查询操作属性的API. Memory API 定义常用的记忆功能. Console API 使应用程

  • 编程语言 使用golang作为编程语言(对部分关键字限制,以保证处理的有序性),而不是重新创造编程语言。 golang是一个简单、易用的编程语言,它有完善的帮助文档和开发工具。 它是强类型校验,编译阶段就能够校验发现很多bug。 它是模块化的,本系统能够简单屏蔽外部功能,使智能合约处在简单可预期的环境中。 已经有大量的golang开发人员,他们如果要开发智能合约,非常容易上手。 智能合约的分类 公