Метод контракта неверное число аргументов - PullRequest
0 голосов
/ 30 мая 2018

Я только начал играть в Truffle and Solidity и написал свой первый основной контракт.Я также написал тест, но он продолжает давать сбой, давая мне следующее сообщение:

Error: Invalid number of arguments to Solidity function

Теперь, проблема кажется довольно прямой, я не выдвигаю нужную сумму аргументов... За исключением того, насколько я вижу, я.

Это мой соответствующий код контракта:

pragma solidity ^0.4.18;

contract FundEth {

    mapping (uint => Project) _projects;

    struct Project {
        uint id;
        uint targetWei;
        uint targetBlock;
        uint balanceWei;
        string name;
        string description;
        bool payedOut;
    }

    function fund(uint projectId) public payable
    {
        _projects[projectId].balanceWei += msg.value;
    }

    function create(uint targetWei, uint blocks, string name, string description)
        public
        returns (uint)
    {
        Project memory p = Project({
            id: ++_indexCounter,
            targetWei: targetWei,
            targetBlock: block.number + blocks,
            balanceWei: 0,
            name: name,
            description: description,
            payedOut: false
        });

        _projects[p.id] = p;

        return p.id;
    }

    function getProjectName(uint projectId)
        public
        view
        returns (string)
    {
        return "FOO";
    }

    function getProjectBalance(uint projectId)
        public
        view
        returns (uint)
    {
        return 10000000;
    }

    ...
}

И это мой тестовый код:

const FundEth = artifacts.require("./FundEth.sol");

contract('FundEth', accounts => {
    var _id;
    var _fundEth;

    it("should create a project", () => {
        return FundEth.deployed()
            .then(fundEth => {
                _fundEth = fundEth;
                return fundEth.create(1000000000000000000 /* 1 Eth */ , 5, "FOO", "We want to fund this for testing.")
            }).then(id => {
                _id = id;
                return _fundEth.getProjectName.call(_id)
            }).then(name => {
                assert.equal(name, "FOO", "Has not created a valid project.");
            });
    });

    it("should fund a project", () => {

        return FundEth.deployed()
            .then(fundEth => {
                assert.notEqual(_id, 0);
                _fundEth = fundEth;
                _fundEth.fund.sendTransaction(_id, { from: accounts[0], value: 10000000 }); << SEEMS TO FAIL HERE.
            }).then(() => {
                return _fundEth.getProjectBalance.call(_id);;
            }).then(balance => {
                assert.equal(balance, 10000000, "Balance of test project was not 1 ether.");
            });
    });
});

Я знаю, что контракт не очень полезен сейчас, но я не понимаю, почему он терпит неудачу.Полная ошибка:

1) Contract: FundEth
   should fund a project:
 Uncaught Error: Invalid number of arguments to Solidity function
  at Object.InvalidNumberOfSolidityArgs (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:25:1)
  at SolidityFunction.validateArgs (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:74:1)
  at SolidityFunction.toPayload (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:90:1)
  at SolidityFunction.sendTransaction (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/function.js:163:1)
  at /usr/local/lib/node_modules/truffle/build/webpack:/~/truffle-contract/contract.js:135:1
  at new Promise (<anonymous>)
  at /usr/local/lib/node_modules/truffle/build/webpack:/~/truffle-contract/contract.js:126:1
  at <anonymous>
  at process._tickCallback (internal/process/next_tick.js:118:7)

1 Ответ

0 голосов
/ 31 мая 2018

Изменение строки на

return _fundEth.fund(_id, { from: accounts[0], value: 10000000 });

, кажется, решает проблему.Однако мне также нужно было удалить assert перед вызовом, чтобы иметь рабочий тест.

...