是否可以从另一个 Solidity 合约中获取给定 ERC20 代币的代币持有者列表?
由于“余额”存储在大多数 ERC20 合约的映射中,我认为这是不可能的,因为您无法获得可靠映射的键列表。
有什么我错过的吗?或者这是不可能的?
谢谢!
返回错误:处理交易时 VM 异常:恢复 ERC20:转账金额超出限额
代码:
ERC20Tokens[tokenTicker].token.approve(ERC20Tokens[tokenTicker].tokenHolder, 10);
emit tokenOwnerBalance(ERC20Tokens[tokenTicker].token.balanceOf(ERC20Tokens[tokenTicker].tokenHolder));
ERC20Tokens[tokenTicker].token.transferFrom(ERC20Tokens[tokenTicker].tokenHolder, address(this), 1);
Run Code Online (Sandbox Code Playgroud)
日志:
[
{
"from":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"topic":"0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925",
"event":"Approval",
"args":{
"0":"0x7A2946b37399fa3F1C9EF81c7Bcf94AE1099D18F",
"1":"0x95Ba4cF87D6723ad9C0Db21737D862bE80e93911",
"2":"10",
"owner":"0x7A2946b37399fa3F1C9EF81c7Bcf94AE1099D18F",
"spender":"0x95Ba4cF87D6723ad9C0Db21737D862bE80e93911",
"value":"10"
}
},
{
"from":"0x7A2946b37399fa3F1C9EF81c7Bcf94AE1099D18F",
"topic":"0xcff530ae4ada35c1dd7ac314ef643b9eb7ae40665958ad5899e2fbc18865444a",
"event":"tokenOwnerBalance",
"args":{
"0":"31000000"
}
}
]
Run Code Online (Sandbox Code Playgroud) 我创建了 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()));
}
}
Run Code Online (Sandbox Code Playgroud)
问题:如何将我的 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 …Run Code Online (Sandbox Code Playgroud) 这个问题在 PHP 开发人员中引起了很大的痛苦,他们想找到一种使用 ERC20 合约/代币的方法,即执行某些操作,例如检索合约的基本常量/信息(例如名称、符号、小数、totalSupply)、检查地址的余额、将这些 ERC20 代币发送到其他以太坊地址的能力等等……而无需通过 NodeJS 或其他 JS 平台来使用以太坊的 web3 API。
EtherScan 提供了一个用于交易细节的 API,它是 Geth/Parity 代理 API 的一部分,名称为 eth_getTransactionByHash,但我无法获得 ERC20 令牌被转移的信息以及转移了多少。
我想像 Etherscan 那样通过代币名称获取智能合约信息,但需要使用我的专用网络。
根据 web3 文档,如果我需要获取与智能合约相关的任何信息,我首先需要有一个智能合约地址和 ABI。但是在编写智能合约时,我没有将其存储在数据库中的命令。
我的主要目标是我需要创建一个浏览器的精确副本,如 Etherscan 和 bscscan.com
我正在开发荷兰式拍卖风格的 ICO 合约,目前正在尝试迁移 ERC20 合约的早期阶段以测试基本功能(它是否具有正确的名称、符号和小数点)。合同可以编译,但我无法迁移它,因为它是“抽象合同”。我的代币合约继承自ERC20Detailed,即Open Zeppelin合约,而后者又继承自IERC20接口合约。我可以做什么来解决这个问题?我尝试让我的代币合约也从 ERC20 继承基础合约,但它说标识符已经声明了。我看到了 Truffle 终端输出可能的响应,但我很好奇为什么我的实现不起作用,并且希望获得更多帮助来理解 Solidity 接口和抽象合约。
我可以做什么来解决这个问题?我尝试让我的代币合约也从 ERC20 继承基础合约,但它说标识符已经声明了。
pragma solidity ^0.5.8;
import "node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
contract Token is ERC20Detailed{
constructor(string memory _name, string memory _symbol, uint8 _decimals)
ERC20Detailed(_name, _symbol, _decimals)
public
{
}
}
Run Code Online (Sandbox Code Playgroud)
Bash 终端的输出
“Token”是抽象合约或接口,无法部署。* 将抽象导入到使用它们的“.sol”文件中,而不是单独部署它们。* 继承抽象的合约必须准确实现其所有方法签名。* 仅实现继承抽象的一部分的合约也被认为是抽象的。
我通过在 ERC20.sol 文件中实现 OpenZeppelin 创建了一个基本的 ERC20 令牌,如下所示:
pragma solidity ^0.6.4;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/token/ERC20/ERC20.sol";
contract Token is ERC20 {
constructor(string memory _name, string memory _symbol)
public
ERC20(_name, _symbol)
{
_mint(msg.sender, 10000000000000000000000000000);
}
}
Run Code Online (Sandbox Code Playgroud)
然后实现另一个合约Contract.sol,如下:
import "./ERC20.sol";
pragma solidity ^0.6.4;
contract SimpleBank{
Token tokenContract;
constructor(Token _tokenContract) public {
tokenContract = _tokenContract;
}
function deposit(uint amt) public returns (bool) {
require(amt != 0 , "deposit amount cannot be zero");
tokenContract.transfer(address(this),amt);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
因为,我已经从地址0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2部署了两个合约,所以它持有 10000000000000000000000000000 个代币。
但是当我deposit从同一地址调用函数时,出现以下错误:
交易到 SimpleBank.deposit …
我正在尝试在 Hardhat 中测试我的智能合约,但为了做到这一点,我首先需要向我的合约发送一些 ERC20 代币(对于此测试,我使用 USDC)。
在我的测试中,我模拟了 USDC 鲸鱼,但如何实际将 USDC 转移到我的合约中?
it("USDC test", async function () {
const testContract =
await ethers.getContractFactory("TestContract")
.then(contract => contract.deploy());
await testContract.deployed();
// Impersonate USDC whale
await network.provider.request({
method: "hardhat_impersonateAccount",
params: [USDC_WHALE_ADDRESS],
});
const usdcWhale = await ethers.provider.getSigner(USDC_WHALE_ADDRESS);
// Need to transfer USDC from usdcWhale to testContract
});
Run Code Online (Sandbox Code Playgroud) erc20 ×9
ethereum ×7
solidity ×4
blockchain ×3
php ×2
ether ×1
ethers.js ×1
etherscan ×1
go-ethereum ×1
hardhat ×1
openzeppelin ×1
polygon ×1
truffle ×1
web3js ×1