gpt4 book ai didi

solidity - 如何使用 solidity 将 ERC20 代币转移到另一个地址?

转载 作者:行者123 更新时间:2023-12-05 08:35:50 26 4
gpt4 key购买 nike

我创建了 ERC20 代币,我想将我的代币转移到另一个地址。

我的元掩码中有两个帐户。(帐户 A/B)

我的 ERC20 代码在这里(我在账户 A 中部署并保存了代币)

pragma solidity ^0.8.0;
// SPDX-License-Identifier: MIT

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20 {
constructor(string memory name, string memory symbol) ERC20(name,symbol) {
// mint 1000 token
_mint(msg.sender, 1000*10**uint(decimals()));
}
}

问题:如何将我的 ERC20 代币从当前地址转移到另一个地址? (A->B)

我在帐户 A 中使用此代码,但不起作用。

pragma solidity ^0.8.7;
// SPDX-License-Identifier: MIT

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol";

contract TokenTransfer {
IERC20 _token;

// token = MyToken's contract address
constructor(address token) public {
_token = IERC20(token);
}

// to = Account B's address
function stake(address to, uint amount) public {
_token.approve(address(this), amount);

require(_token.allowance(address(this), address(this)) >= amount);
_token.transferFrom(msg.sender, to, amount);
}
}

错误信息

transact to TokenTransfer.stake errored: Internal JSON-RPC error.
{
"code": 3,
"message": "execution reverted: ERC20: insufficient allowance",
"data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000"
}

如何解决?

最佳答案

你的逻辑错了!如果您想在不通过智能合约的情况下将代币从账户 A 发送到账户 B,您可以使用 Metamask 和其他钱包中提供的“发送”选项。如果你想使用智能合约,你的逻辑就会改变。在您的智能合约代码中,存在一些错误:

  • _token.approve(address(this), amount):当您编写此语句时,您正在批准智能合约本身移动您的代币,但它没有任何代币!关于 approve() 函数的另一件事。此操作必须由用户执行,具体而言,用户必须向智能合约授予访问其钱包的权限;
  • 另一个错误是:智能合约不能没有从帐户 A 调用存款 token 的功能。在这种情况下,当您编写此语句时,_token.transferFrom(msg.sender, to, amount); ,(msg.sender 是智能合约)您不能将任何金额转移到接收方地址,因为智能合约没有代币数量。
  • 最后一个问题,当您将 token 从智能合约转移到地址时,您必须使用 transfer() 函数而不是 transferFrom() 因为最后一个函数需要批准 + 转移智能合约无法自行批准。而 transfer() 仅用于转移资金。

要解决这个问题,你可以看这个智能合约代码:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol";

contract TokenTransfer {
IERC20 _token;

// token = MyToken's contract address
constructor(address token) {
_token = IERC20(token);
}

// Modifier to check token allowance
modifier checkAllowance(uint amount) {
require(_token.allowance(msg.sender, address(this)) >= amount, "Error");
_;
}

// In your case, Account A must to call this function and then deposit an amount of tokens
function depositTokens(uint _amount) public checkAllowance(_amount) {
_token.transferFrom(msg.sender, address(this), _amount);
}

// to = Account B's address
function stake(address to, uint amount) public {
_token.transfer(to, amount);
}

// Allow you to show how many tokens owns this smart contract
function getSmartContractBalance() external view returns(uint) {
return _token.balanceOf(address(this));
}

}

关于solidity - 如何使用 solidity 将 ERC20 代币转移到另一个地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71941928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com