每当我从javascript调用paytest函数(请参见下面的代码片段)时(请参见下面的代码片段),我将收到下面发布的错误消息。无论我使用address.send、address.transfer还是address.call,matter.Nothing都不起作用。我在所有账户上都有大量的ETH测试。
我用安全帽做我当地的连锁店。
请帮帮我。我快疯了。
contract DC is ERC1155, Ownable {
function paytest (address receiver, uint256 amount) public payable{
(bool success, bytes memory _data) = payable(receiver).call{value:amount}("");
require (success, "transaction failed");
data=_data;
}
event Log(string fun, address sender, uint value, bytes data);
fallback() external payable {
emit Log("fallback", msg.sender, msg.value, msg.data);
}
receive() external payable {
emit Log("receive", msg.sender,msg.value, "");
} async function main () { // boiletplate function
const address = '0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9'; // actual contract address
const DC = await ethers.getContractFactory('DC');
const dc = await DC.attach(address);
const [owner, addr1, addr2] = await ethers.getSigners();
await dc.connect(addr1).paytest(address,ethers.utils.parseEther("1.0"));C:\Users\Admin\hhtest>npx hardhat run --network localhost ./scripts/index.js
ProviderError: Error: VM Exception while processing transaction: reverted with reason string 'transaction failed'
at HttpProvider.request (C:\Users\Admin\hhtest\node_modules\hardhat\src\internal\core\providers\http.ts:78:19)
at GanacheGasMultiplierProvider.request (C:\Users\Admin\hhtest\node_modules\hardhat\src\internal\core\providers\gas-providers.ts:312:34)
at processTicksAndRejections (node:internal/process/task_queues:96:5)发布于 2022-05-19 12:55:58
代码中有一个小语法错误。您不能像这样直接在函数中发送所需的ETH。您必须在另一个块中以"value“的名称发送它。因此,与其:
await dc.connect(addr1).paytest(address,ethers.utils.parseEther("1.0"));尝尝这个,
await dc.connect(addr1).paytest(address,{ value: ethers.utils.parseEther("1.0")});Update:我个人在输入ETH值时使用convertWithDecimal()函数的另一种方法。该函数自动处理BigNumber错误。
const isInt = (n: any) => {
return n % 1 === 0;
};
const convertWithDecimal = (value: any, decimal: any) => {
if (value > 0) {
if (isInt(value)) {
value = parseInt(value);
value = BigNumber(value).multiply(decimal);
} else {
value = value * decimal;
value = toFixed(value);
value = parseInt(value.toString().split(".")[0]);
value = toFixed(value);
value = BigNumber(value);
}
return value.toString();
} else {
return 0;
}
};
const toFixed = (x: any) => {
if (Math.abs(x) < 1.0) {
var e = parseInt(x.toString().split("e-")[1]);
if (e) {
x *= Math.pow(10, e - 1);
x = "0." + new Array(e).join("0") + x.toString().substring(2);
}
} else {
var e = parseInt(x.toString().split("+")[1]);
if (e > 20) {
e -= 20;
x /= Math.pow(10, e);
x += new Array(e + 1).join("0");
}
}
return x;
};只需将其粘贴到您的JS文件中,当输入ETH值时,将syntazx更改为以下内容。
await dc.connect(addr1).paytest(address,{ value: convertWithDecimal(1, 10**18});https://ethereum.stackexchange.com/questions/128533
复制相似问题