Reactjs Solidity crowdsale功能在我的网页上失败,但在直接发送时成功,但没有';交易成功时,不要发送ERC20

Reactjs Solidity crowdsale功能在我的网页上失败,但在直接发送时成功,但没有';交易成功时,不要发送ERC20,reactjs,ethereum,solidity,web3,web3js,Reactjs,Ethereum,Solidity,Web3,Web3js,我有一个众筹合同,它直接从我的代币合同中的造币功能处接收代币。该功能造币代币并将其发送到众筹帐户地址。当我跑的时候 let token = await Token.deployed() await token.mint('0xc2646F5bcB2B59a3AB3E6ccD1806D8be241C4A94',50000000000000) 在块菌控制台。我得到一个tx散列和一个传输事件。之后,我对crowdsale帐户进行了一项交易,我测试了一项对crowdsale地址的交易,它使用2100

我有一个众筹合同,它直接从我的代币合同中的造币功能处接收代币。该功能造币代币并将其发送到众筹帐户地址。当我跑的时候

let token = await Token.deployed()

await token.mint('0xc2646F5bcB2B59a3AB3E6ccD1806D8be241C4A94',50000000000000)
在块菌控制台。我得到一个tx散列和一个传输事件。之后,我对crowdsale帐户进行了一项交易,我测试了一项对crowdsale地址的交易,它使用21000 gas

web3.eth.sendTransaction({ to: "0x7B012920910A2A29673A15b24335617bbd2CF451", from: accounts[0], value: 2})
它返回一个tx散列,并且可以工作。当我通过metamask尝试并向众筹发送交易时,我指定了200000的gaslimit,这是众筹合同的建议金额。我发送一个以太,它说等待几秒钟,然后说成功。当我点击与众筹合同交互的网页时,它会导致交易失败

当我查看metamask中的交易详细信息时,它说6385876是失败交易的气体限制。我的众筹合同如下所示

pragma solidity ^0.5.0;

import "./SafeMath.sol";
import "./Token.sol";

contract Own {

    address public owner;

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }
}


// rate is 1 token = 0.01 ether

contract Crowdsale is Own, Token {
    using SafeMath for uint256;

    constructor() public payable{
        rate = 10000000000000000;
        wallet = 0xAa6f0507bF7baaB35E2f0Bb9a318E1D0F61F371b;
    }

    Token public token;
    address payable public wallet;
    uint256 public rate;

    event TokenPurchase(address recipient, uint256 numPaid, uint256 numTokensPurchased);

    function buyTokens() public payable {
        // Define a uint256 variable that is equal to the number of wei sent with the message.
        uint256 val = msg.value;
        require(msg.sender != address(0));
        require(val > 0);
        uint256 tokenAmount = _getTokenAmount(val);
        require(token.balanceOf(address(this)) >= tokenAmount);
        token.transferFrom(address(this), msg.sender, tokenAmount);
        emit TokenPurchase( msg.sender, val, tokenAmount);
        _forwardFunds();
    }
    
    function () external payable{
        buyTokens();
    }

    function _getTokenAmount(uint256 weiVal) internal returns (uint256) {
        return weiVal * rate;
    }

    function _forwardFunds() internal {
        transferFrom.(address(this), address(wallet), address(this).balance);
    }
}
前端是用react编写的。我在另一个成功发送事务的页面中以同样的方式实例化了web3对象

  const accounts = await MyWeb3.getInstance().getAccounts();
  console.log(accounts);
  const crowdsale = MyWeb3.getInstance().getContract(Crowdsale);
  const crowdsaleInstance = await MyWeb3.getInstance().deployContract(crowdsale);
  console.log(crowdsaleInstance);
  const res = crowdsaleInstance.eth.sendTransaction({ to: "0x7B012920910A2A29673A15b24335617bbd2CF451", from: accounts[0], value: ether})//.estimateGas({gas: 200000})
我通过metamask直接发送到crowdsale地址的交易(不在网页上)有效,但它们不会将任何ERC20代币发送到买家地址。当我将自定义令牌添加到metamask时,它会识别并生成一个钱包,但余额保持在0。它本来应该转帐,但它也没有这样做。它只是将以太发送到众包销售合同地址,而这些资金只是停留在ganache的账户顶部


这是我的项目的最后一部分,我已经被困在这个问题上三天了。我想不出来。我真的需要帮助理解这个问题以及如何解决它。谢谢

首先,让
buytokes()
函数工作,然后尝试回退功能。为此,请检查以下值:

  • msg.value
    要通过
    require
  • 众售合同的代币余额,要通过
    要求
  • 注意:您可以将消息添加到
    要求
    以了解消息的下落

  • 最重要的是,以下代码的含义:
  • 也许你需要:

    function _forwardFunds() internal {
      wallet.transfer(address(this).balance);
    }
    
    难道不是吗

    function _getTokenAmount(uint256 weiVal) internal returns (uint256) {
            return weiVal / rate;
        }
    

    谢谢你的帮助。最后,这是因为迁移文件给了crowdsale一个与块菌输出中不同的地址,但我最终找到了解决办法。谢谢你的回答
    function _forwardFunds() internal {
      transferFrom.(address(this), address(wallet), address(this).balance);
    }
    
    function _forwardFunds() internal {
      wallet.transfer(address(this).balance);
    }
    
    function _getTokenAmount(uint256 weiVal) internal returns (uint256) {
            return weiVal * rate;
        }
    
    function _getTokenAmount(uint256 weiVal) internal returns (uint256) {
            return weiVal / rate;
        }