У меня есть код для перевода эфира на адрес следующим образом:
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
}));
}
}
Как я могу перевести деньги на адреса пользователей из контракта?
Глядя на вашу транзакцию 0xdd6c0059b330dc... оба перевода были выполнены правильно.
Например второй перевод идет на адрес 0xbc965738eabb38... , надо смотреть на вкладку "Внутренняя транзакция", там есть строчка "Родительский хеш" 0xdd6c0059b330dc...
и блок 1287872
на сумму 0.05402... эфира.
Обычно «внутренние транзакции» не отслеживаются большинством кошельков, потому что для этого требуется обработка каждой транзакции, а для доступа к ним нет общедоступного API.
Исмаэль
пользователь2609980
Исмаэль
пользователь2609980