首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >稳固性: address.send、address.transfer和address.call都不起作用。

稳固性: address.send、address.transfer和address.call都不起作用。
EN

Ethereum用户
提问于 2022-05-19 10:51:00
回答 1查看 82关注 0票数 0

问题

每当我从javascript调用paytest函数(请参见下面的代码片段)时(请参见下面的代码片段),我将收到下面发布的错误消息。无论我使用address.send、address.transfer还是address.call,matter.Nothing都不起作用。我在所有账户上都有大量的ETH测试。

我用安全帽做我当地的连锁店。

请帮帮我。我快疯了。

实心码

代码语言:javascript
复制
    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, "");
        
    }

Javascript文件

代码语言:javascript
复制
   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"));

错误消息控制台

代码语言:javascript
复制
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)
EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-05-19 12:55:58

代码中有一个小语法错误。您不能像这样直接在函数中发送所需的ETH。您必须在另一个块中以"value“的名称发送它。因此,与其:

代码语言:javascript
复制
await dc.connect(addr1).paytest(address,ethers.utils.parseEther("1.0"));

尝尝这个,

代码语言:javascript
复制
await dc.connect(addr1).paytest(address,{ value: ethers.utils.parseEther("1.0")});

Update:我个人在输入ETH值时使用convertWithDecimal()函数的另一种方法。该函数自动处理BigNumber错误。

代码语言:javascript
复制
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更改为以下内容。

代码语言:javascript
复制
await dc.connect(addr1).paytest(address,{ value: convertWithDecimal(1, 10**18});
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/128533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档