Solidity - Elterngeld anrufen nicht möglich?

Ich versuche, die zahlbare Funktion eines Elternteils zu erben und zu überschreiben (und einige Modifikatoren und Logik hinzuzufügen), aber bisher scheint dies nicht möglich zu sein.

Mein erster intuitiver Versuch war ungefähr so:

contract foo {
    function test() public payable returns (uint256) {
        return msg.value;
    }
}

contract bar is foo {
    function test() public payable returns (uint256) {
        return super.test.value(msg.value / 2)();
    }
}

und Kompilierfehler erhalten:

TypeError: Member "value" not found or not visible after argument-dependent lookup in function () - did you forget the "payable" modifier?
    super.test.value(msg.value)();

Der Funktion einen anderen Namen zu geben funktioniert auch nicht, also ist es kein vorrangiges Problem.

contract foo {
    function test() public payable returns (uint256) {
        return msg.value;
    }
}

contract bar is foo {
    function anotherTest() public payable returns (uint256) {
        return super.test.value(msg.value / 2)();
    }
}

Ich bin etwas weiter gekommen, indem ich den Compiler mit einem Casting ausgetrickst habe, aber das ist offensichtlich nicht gut, da es zur Laufzeit eine Endlosschleife verursachen würde:

contract foo {
    function test() public payable returns (uint256) {
        return msg.value;
    }
}

contract bar is foo {
    function test() public payable returns (uint256) {
        return foo(address(this)).test.value(msg.value / 2)();
    }
}

Was funktioniert, ist die Kombination der beiden, dh ihm einen anderen Namen und eine andere Besetzung zu geben:

contract foo {
    function test() public payable returns (uint256) {
        return msg.value;
    }
}

contract bar is foo {
    function anotherTest() public payable returns (uint256) {
        return foo(address(this)).test.value(msg.value / 2)();
    }
}

Jetzt gibt der Aufruf von bar.test() mit 6 wei 6 zurück und der Aufruf von bar.anotherTest() gibt 3 zurück. Aber das ist nicht genau das, was ich will, da es immer noch test() durch bar verfügbar macht.

Also was mache ich falsch, oder ist das Absicht? Würde wirklich gerne verstehen, warum sich Solidity so verhält und ob es eine Problemumgehung gibt, um das zu erreichen, was ich will. Danke!

Antworten (1)

Da fooes sich um den Basisvertrag handelt, rufst du dich selbst innerhalb desselben Vertrags an, barwenn du anrufst .super.test()

Jetzt versuchen Sie, sich die Hälfte zu schicken, msg.valueund die andere Hälfte bleibt noch in Ihrem Vertrag.

Ich würde empfehlen, den gewünschten Wert als Parameter der Funktion zu übergeben.

Ja, ich habe es schließlich herausgefunden. Wie Sie erklärt haben, calle ich innerhalb desselben Vertrags und es gibt wirklich keinen Grund, Ether an dieselbe Pocket erneut zu senden, ein einfacher Call super.test()ohne .valueoder mit einem Parameter würde ausreichen. Danke!