Перевод эфира с контракта на адреса пользователей

У меня есть код для перевода эфира на адрес следующим образом:

addr.transfer(amount);

К сожалению, когда я выполняю это заявление для двух переводов, деньги никогда не поступают на addrадреса. Я вижу вывод Etherscan на Ropsten:

введите описание изображения здесь

У меня есть подозрение, что переводы (call_1_0 и call_1_1 ниже) никогда не выполняются, потому что GasLimit установлен на 2300. Возможно ли это?

Есть ли способ увеличить GasLimit? Я пытался использовать:

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

но тогда solcкомпилятор говорит:

Ошибка типа: элемент «газ» не найден или не отображается после поиска в функции, зависящей от аргумента (uint256)
addr.transfer.gas(GAS_LIMIT)(количество);
^---------------^

Это полный код контракта (бенефициары добавляются во время построения контрактом «менеджера», который создает его экземпляр.

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
    }));
  }

}

Как я могу перевести деньги на адреса пользователей из контракта?

Глядя на ropsten.etherscan.io/tx/… , кажется, что оба переноса были выполнены правильно. Во-вторых, на ropsten.etherscan.io/address/… вы должны посмотреть на вкладку «Внутренняя транзакция», там есть строка, где «Родительский хеш» — 0xdd6c0059b330dc… блок — 1287872 перевод на 0,05402… эфира.
@Исмаэль спасибо. Итак, ETH был добавлен на счет 0xbC965738eAbb38d15dc5d0B63Ec1420EAb5df2BC? Я просто должен смотреть на внутренние транзакции, а не на транзакции или кошелек MetaMask? :)
Да, обычно «внутренние транзакции» не отслеживаются кошельками, потому что пока не существует простого интерфейса для доступа к ним.
@Исмаэль Спасибо! Это решает мою проблему. Если вы хотите, вы можете добавить свой комментарий в качестве ответа, чтобы я мог его принять.

Ответы (1)

Глядя на вашу транзакцию 0xdd6c0059b330dc... оба перевода были выполнены правильно.

Например второй перевод идет на адрес 0xbc965738eabb38... , надо смотреть на вкладку "Внутренняя транзакция", там есть строчка "Родительский хеш" 0xdd6c0059b330dc...и блок 1287872на сумму 0.05402... эфира.

Обычно «внутренние транзакции» не отслеживаются большинством кошельков, потому что для этого требуется обработка каждой транзакции, а для доступа к ним нет общедоступного API.