Erc-20

向合約發送 ETH 時總是用完 gas

  • May 21, 2021

我正在嘗試使用 OpenZeppelin 4.x 實施 Crowdsale 契約,因為此版本已從其儲存庫中刪除了 Crowdsale.sol。

我的目標是將 ETH 發送到合約,作為交換接收“黃金”並將收到的 ETH 重定向到罐子錢包。

Gold 是一個簡單的 ERC20 預設代幣。

這是程式碼:

// SPDX-License-Identifier: BSD-Protection
pragma solidity ^0.8.0;


import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.1.0/contracts/token/ERC20/ERC20.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.1.0/contracts/utils/math/SafeMath.sol";

import "./gold.sol";

contract Crowdsale {
   using SafeMath for uint256;
   ERC20 private token;
   address payable private wallet;
   uint256 private rate;
   uint256 public weiRaised;

   constructor( uint256 _rate, address payable _wallet, address _token )  {
       require(_rate > 0);
       require(_wallet != address(0));

       rate = _rate;
       wallet = _wallet;
       token = Gold(_token);
   }


   receive() external payable {
       require( msg.value > 0 );
   
       uint256 tokens = msg.value.mul( rate );
       weiRaised = weiRaised.add( msg.value );
   
       token.transfer( msg.sender, tokens );
       wallet.transfer( msg.value );
   }


}

我總是沒油….

明白了!

這裡有很多問題:

  1. 眾籌合約的黃金代幣餘額中沒有一枚硬幣。解決了使用 Metamask 向 Crowdsale 地址發送一些黃金的問題。
  2. 我正在計算uint256 tokens = msg.value.mul( rate );,但 msg.value 在 wei 中。所以發送 0.001 ETH 仍然是太多的錢。(100000000000 wei 乘以匯率將是太多的黃金無法發送)。這個我看不出如何解決,因為我的意圖是使用 BSC,我不知道 BNB 在這種情況下是如何工作的。
  3. 至少正如理查德霍羅克斯在他的回答中指出的那樣,我花費了太多的汽油。

引用自:https://ethereum.stackexchange.com/questions/99422