Ich habe Unit-Tests für einen Vertrag mit Hardhat + Ethers + Typescript geschrieben, nennen wir es ContractA. Dieser ContractA enthält eine hartcodierte Adresse eines bereitgestellten ERC20-Tokens wie folgt TokenA = '0x...'
. Also in den Tests mache ich:
ContractA = await ethers.getContractFactory("ContractA");
contractA = await upgrades.deployProxy(ContractA);
und dann teste ich einige Funktionen, die normal funktionieren.
Aber wenn ich versuche, eine bestimmte Funktion in ContractA zu testen, die die fest codierte ERC20-Adresse wie folgt verwendet:
function buyExtra(address Owner, uint256 count) public whenNotPaused {
...
IERC20Upgradeable(TokenA).safeTransferFrom(msg.sender, address(this), count);
...
}
Es funktioniert nicht und ich habe die Fehlermeldung erhaltenError: VM Exception while processing transaction: revert Address: call to non-contract.
PS: Ich glaube, ich verstehe den Grund, das liegt daran, dass die in ContractA angegebene fest codierte Adresse die Adresse des ERC20-Tokens in Rinkeby ist. Als solches existiert es in der Testumgebung nicht.
Also was soll ich tun? Ist es möglich, den ERC20-Vertrag in der Testumgebung mit genau der gleichen Adresse einzusetzen, die er in Rinkeby hat? Muss ich das tun? Übrigens habe ich in meinem Projekt keinen ERC20-Vertrag.
Sie sollten Bereitstellungsinformationen an den Vertrag übergeben, z. B. über den Konstrukteur. Dann haben Sie eine gewisse Flexibilität bei Migrationen und Tests.
(Zum Beispiel).
Eine alternative Möglichkeit besteht darin, zu versuchen, die öffentliche Kette zu forken und dann dagegen zu testen.
Ich hoffe es hilft
AKTUALISIEREN
import "./IERC20.sol";
contract X {
IERC20 token;
constructor(address _token) {
token = IERC20(_token);
}
}
Auf einem Telefon skizziert. Keine Garantie ;-)
afm
Rob Hitchens
IERC20 token = IERC20(thatAddress);