Ошибка: недопустимое количество аргументов функции Solidity в простом контракте краудсейла

Я новичок в разработке смарт-контрактов. Я использую openZeppelin, трюфель и Ganache, чтобы разработать действительно базовый токен и контракт краудсейла. Я столкнулся с ошибкой при попытке вызвать метод buytoken() из контракта краудсейла в консоли Truffle. Может ли кто-нибудь помочь мне решить проблему? Нет проблем при переносе и развертывании контракта.

contract Crowdsale {
    using SafeMath for uint256;

// The token being sold
    ERC20 public token;

// Address where funds are collected
    address public wallet;

// How many token units a buyer gets per wei.
// The rate is the conversion between wei and the smallest and indivisible token unit.
// So, if you are using a rate of 1 with a DetailedERC20 token with 3 decimals called TOK
// 1 wei will give you 1 unit, or 0.001 TOK.
uint256 public rate;

// Amount of wei raised
    uint256 public weiRaised;

/**
* Event for token purchase logging
* @param purchaser who paid for the tokens
* @param beneficiary who got the tokens
* @param value weis paid for purchase
* @param amount amount of tokens purchased
*/
    event TokenPurchase(
        address indexed purchaser,
        address indexed beneficiary,
        uint256 value,
        uint256 amount
);

/**
* @param _rate Number of token units a buyer gets per wei
* @param _wallet Address where collected funds will be forwarded to
* @param _token Address of the token being sold
*/
    constructor(uint256 _rate, address _wallet, ERC20 _token) public {
        require(_rate > 0);
        require(_wallet != address(0));
        require(_token != address(0));

        rate = _rate;
        wallet = _wallet;
        token = _token;
}

// -----------------------------------------
// Crowdsale external interface
// -----------------------------------------

/**
* @dev fallback function ***DO NOT OVERRIDE***
*/
function () external payable {

}

/**
* @dev low level token purchase ***DO NOT OVERRIDE***
* @param _beneficiary Address performing the token purchase
*/
    function buyTokens(address _beneficiary, uint256 amount) public payable {

        uint256 weiAmount = amount.mul(rate);

        token.transfer(_beneficiary, weiAmount);

}

Команда консоли truffle приведена ниже:

myToken.deployed().then(function(i){BT = i})
myCrowdsale.deployed().then(function(i){BTC = i})
BT.transferOwnership(BTC.address)
purchaser = web3.eth.accounts[2]
BTC.buyTokens(purchaser,web3.toWei(5, "ether") )

person Neo Yang    schedule 21.06.2018    source источник


Ответы (1)


При реализации payable уплаченная сумма не должна быть аргументом, но вместо этого она будет доступна на msg.value. В противном случае вы не отправляете эфир и / или можете использовать его, если я вызываю метод с: 5 ether как amount, но я отправляю только 1 wei.

function buyTokens(address _beneficiary) public payable {

        uint256 weiAmount = msg.value.mul(rate);

        token.transfer(_beneficiary, weiAmount);

}

Кроме того, если адрес получателя совпадает с адресом покупателя токена, вы можете использовать: msg.sender

И метод должен называться так:

BTC.buyTokens(purchaser, { value: web3.toWei(5, "ether"), from: purchaser });

или используя msg.sender

BTC.buyTokens({ value: web3.toWei(5, "ether"), from: purchaser });

Если вы не используете: from, эфиры будут отправлены учетной записью по умолчанию, которая не purchaser в вашем случае.

person Marcos Casagrande    schedule 22.06.2018
comment
Большое спасибо. теперь он работает. Не могли бы вы рассказать мне, как вы нашли это правило? это из документации по солидности? - person Neo Yang; 25.06.2018
comment
Что касается того, как я это знаю, это сочетание здравого смысла, документации и надежности web3. Он не закреплен точно на одной странице, поэтому я не могу ссылаться на него. - person Marcos Casagrande; 25.06.2018