Zuordnung von Adresse => uint256 in Struct, die nach Transaktion im Test einen falschen Wert zurückgibt

Hier mein Vertrag:

pragma solidity ^0.4.4;

import "./SafeMath.sol";

contract TestContract is SafeMath {
    struct Result {
        bytes32 name;
        uint256 balance;
        mapping (address => uint256) betBalances;
    }

    function TestContract(bytes32[] _resultNames) {
        for (uint i = 0; i < _resultNames.length; i++) {
            results.push(Result({
            name: _resultNames[i],
            balance: 0
            }));
        }
    }

    function getBetBalance(uint resultIndex) public validResultIndex(resultIndex) constant returns (uint256) {
        return results[resultIndex].betBalances[msg.sender];
    }

    function bet(uint resultIndex) public hasNotEnded payable {
        Result storage result = results[resultIndex];
        result.balance = safeAdd(result.balance, msg.value);
        result.betBalances[msg.sender] = safeAdd(result.betBalances[msg.sender], msg.value);
    }
}

Hier ist mein Testcode:

const web3 = global.web3;
const TestContract = artifacts.require("./TestContract.sol");

contract('TestContract', function(accounts) {
    const params = {
        _owner: accounts[0],
        _name: "test",
        _resultNames: ["first", "second", "third"],
        _bettingEndBlock: 1000
    };

    let testContract;

    it("allows users to bet if the betting end block has not been reached", async function() {
        testContract = await TestContract.new(...Object.values(params));

        testContract.BetAccepted().watch((error, response) => {
            if (error) {
                console.log("Event Error: " + error);
            } else {
                console.log("Event Triggered: " + JSON.stringify(response.event));
                console.log("resultIndex: " + JSON.stringify(response.args._resultIndex));
                console.log("betAmount: " + JSON.stringify(response.args._betAmount));
                console.log("betBalance: " + JSON.stringify(response.args._betBalance));
            }
        });

        let initialBalance = web3.eth.getBalance(testContract.address).toNumber();
        let betAmount = web3.toWei(1, 'ether');
        let betResultIndex = 0;

        await testContract.bet(betResultIndex, { from: accounts[1], value: betAmount });
        let newBalance = web3.eth.getBalance(testContract.address).toNumber();
        let difference = newBalance - initialBalance;
        assert.equal(difference, betAmount, "New result balance does not match added bet.");

        let resultBalance = await testContract.getResultBalance(betResultIndex);
        assert.equal(resultBalance, betAmount, "Result balance does not match.");

        let betBalance = await testContract.getBetBalance(betResultIndex);
        assert.equal(betBalance.toString(), betAmount, "Bet balance does not match.");
    });

Und hier der Konsolenfehler:

/Users/xxx/.config/yarn/global/node_modules/truffle/build/cli.bundled.js:213982
        throw reason;
        ^
AssertionError: Bet balance does not match.: expected '0' to equal '1000000000000000000'
    at /Users/xxx/coding/xxx/test/topic.js:75:11
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)

Ich habe bestätigt, dass die Wettmethode funktioniert, indem ich ein hinzugefügt Eventhabe und dass das betBalanceso ist, wie es sein sollte (nicht in diesem Code enthalten). Aber es wird als 0 auf der Testseite zurückgegeben. Warum passiert das?

Ich weiß, dass Transaktionen keine Werte zurückgeben können, aber wird mein Aufruf zum Abrufen von resultBalance als Transaktion betrachtet, da ich den Aufruf verkette?

Bitte posten Sie entweder Ihren gesamten Solidity-Code oder grenzen Sie ihn auf eine einfachere Demonstration des Fehlers ein, den andere reproduzieren können.
Beitrag aktualisiert, um einfachen testbaren Code einzuschließen.
Sind Sie sicher , dass die betMethode richtig funktioniert? Sie speichern das lokale resultObjekt nicht zurück in die Hauptzuordnung ( results[resultIndex] = result), also wird es möglicherweise nicht richtig gespeichert?
@MidnightLightning Ja, ich bin sicher, dass es richtig funktioniert. Ich habe eine Event, die ich verwende, um den Wert von zurückzugeben, results[resultIndex].betBalances[msg.sender]und sie zeigt richtig den korrekten Kontostand an.

Antworten (1)

Ihr msg.sender ist nicht derselbe. Beim ersten Aufruf verwenden Sie { from: accounts[1] .. Beim zweiten nicht. Wenn Sie das verwendete Konto nicht angeben, handelt es sich um Konten[0]

Du hast recht @decanus. Eigentlich habe ich das gleich herausgefunden, nachdem ich das Kopfgeld eingestellt hatte, lol. Aber, guter Fang! Du hast es verdient!