Übertragen Sie Ether vom Vertrag zu den Benutzeradressen

Ich habe Code, um Ether wie folgt an eine Adresse zu übertragen:

addr.transfer(amount);

Wenn ich diese Anweisung für zwei Überweisungen ausführe, kommt das Geld leider nie an den addrAdressen an. Ich sehe die Etherscan-Ausgabe auf Ropsten:

Geben Sie hier die Bildbeschreibung ein

Ich habe den Verdacht, dass die Überweisungen (call_1_0 und call_1_1 unten) nie ausgeführt werden, weil das GasLimit auf 2300 eingestellt ist. Ist das möglich?

Gibt es eine Möglichkeit das GasLimit zu erhöhen? Ich habe versucht mit:

  uint GAS_LIMIT = 4000000;
  addr.transfer.gas(GAS_LIMIT)(amount);

aber dann solcsagt der Compiler:

TypeError: Member „gas“ nicht gefunden oder nicht sichtbar nach argumentabhängiger Suche in Funktion (uint256)
addr.transfer.gas(GAS_LIMIT)(amount);
^---------------^

Dies ist der vollständige Code des Vertrags (Begünstigte werden während der Erstellung durch einen „Manager“-Vertrag hinzugefügt, der ihn instanziiert.

contract SimpleSmartAsset is Mortal {

  uint usagePrice;
  Beneficiary[] beneficiaries;
  uint totalWeight; // to calculate percentage the beneficiaries receive

  event AssetCreated(uint _usagePrice,
                     address[] addresses,
                     uint[] weights);

  function SimpleSmartAsset(uint _usagePrice,
                            address[] addresses,
                            uint[] weights) {
    owner = msg.sender;
    usagePrice = _usagePrice;

    uint beneficiaryCount = addresses.length;
    for (uint i = 0; i < beneficiaryCount; i++) {

      uint weight = weights[i];

      addBeneficiary(addresses[i], weight);
      totalWeight += weight;
    }

    AssetCreated(_usagePrice, addresses, weights);
  }

  function getUsagePrice() constant returns (uint) {
    return usagePrice;
  }

  event BeneficiaryPaid(address addr, uint amount);

  function pay() payable onlyOwner {
    require(msg.value >= usagePrice);

    uint beneficiaryCount = beneficiaries.length;
    for (uint i = 0; i < beneficiaryCount; i++) {

      Beneficiary memory beneficiary = beneficiaries[i];

      uint weight = beneficiary.weight;
      address addr = beneficiary.addr;

      uint amount = (weight * usagePrice) / totalWeight;

      uint GAS_LIMIT = 4000000;
      addr.transfer.gas(GAS_LIMIT)(amount);
      BeneficiaryPaid(addr, amount);
    }
  }

  struct Beneficiary {
    address addr;
    uint weight;
  }

  function addBeneficiary(address addr, uint weight) onlyOwner {
    beneficiaries.push(Beneficiary({
        addr: addr,
        weight: weight
    }));
  }

}

Wie kann ich Geld an die Benutzeradressen aus dem Vertrag überweisen?

Mit Blick auf ropsten.etherscan.io/tx/… scheint es, dass beide Übertragungen korrekt durchgeführt wurden. Die zweite ist ropsten.etherscan.io/address/… Sie sollten sich die Registerkarte „Internal Transaction“ ansehen, dort gibt es eine Zeile, in der „Parent Hash“ 0xdd6c0059b330dc ist … der Block ist 1287872, die Übertragung für 0,05402 … Ether.
@Ismael danke. Die ETH wurde also dem Konto 0xbC965738eAbb38d15dc5d0B63Ec1420EAb5df2BC hinzugefügt? Ich muss nur auf interne Transaktionen schauen und nicht auf Transaktionen oder die MetaMask-Brieftasche? :)
Ja, normalerweise werden "interne Transaktionen" nicht von Wallets verfolgt, da es noch keine einfache Schnittstelle gibt, um darauf zuzugreifen.
@Ismael Danke! Dies löst mein Problem. Wenn Sie möchten, können Sie Ihren Kommentar als Antwort hinzufügen, damit ich ihn akzeptieren kann.

Antworten (1)

Betrachten Sie Ihre Transaktion 0xdd6c0059b330dc ... beide Übertragungen wurden korrekt durchgeführt.

Zum Beispiel ist die zweite Übertragung an die Adresse 0xbc965738eabb38... , Sie sollten sich die Registerkarte "Interne Transaktion" ansehen, dort gibt es eine Zeile, in der "Parent Hash" steht 0xdd6c0059b330dc...und der Block 1287872für einen Betrag von 0,05402... Ether steht.

Normalerweise werden „interne Transaktionen“ von den meisten Wallets nicht verfolgt, da jede Transaktion verarbeitet werden muss und es keine öffentliche API gibt, um darauf zuzugreifen.