Требовать по адресу (this) .transfer (msg.value) выдает ошибку

нужна помощь в понимании того, почему require выдает ошибку и останавливает компиляцию моего контракта. Функция предназначена для того, чтобы позволить владельцу прокси обновить текущую версию контракта прокси и вызвать новую реализацию для инициализации всего, что необходимо, посредством вызова низкого уровня.

function upgradeToAndCall(address implementation, bytes memory data) public payable
    onlyProxyOwner
    {
      upgradeTo(implementation);
      require(address(this).transfer(msg.value)(data),'');
  }

Я получаю две ошибки

No matching declaration found after argument-dependent lookup.

Type is not callable

Любая помощь в этом будет принята с благодарностью.


person Charles Okaformbah    schedule 21.10.2019    source источник
comment
Я начал изучать Solidity, поэтому знаю очень мало, но разве вы не пытаетесь вызвать функцию для не-функции? address(this).transfer(msg.value) не является функцией, но вы передаете ей параметр (data). Я просто пытаюсь решить с вами проблему. Что вы думаете?   -  person Kabard    schedule 21.10.2019
comment
Нет, это функция. address (this) возвращает текущий тип контракта; адрес.   -  person Charles Okaformbah    schedule 21.10.2019
comment
Я понял, address(this) возвращает address, тогда передача (msg.vaule) привязана к этому «адресу». но что все это возвращается? он определенно не возвращает функцию. функция вернет значение, скажем, transfer (msg.value) возвращает логическое значение, тогда то, что вы делаете, истинно (данные). Например   -  person Kabard    schedule 21.10.2019


Ответы (1)


1. Нет необходимости использовать функцию передачи в require, по умолчанию она выдает ошибку, если передача не происходит. Вы можете использовать функцию .send (), если хотите сохранить внутри require ().

2. По умолчанию eth, отправленный через функцию payable, будет сохранен в самом контракте, поэтому нет необходимости использовать address (this) .transfer (msg.value). Вместо этого вы можете использовать и другой адрес для передачи эфира.

3. И передача (данных) в функцию transfer () неверна.

person Dushyanth Kumar Reddy    schedule 22.10.2019
comment
Код взят из OpenZeppelin с некоторыми изменениями, основанными на сообщении об ошибке линтера. github.com/OpenZeppelin/OpenZeppelin/OpenZeppelin/ master / Требуется исходный код (адрес (this) .call.value (msg.value) (data), ''), но он вызывает ошибку. - person Charles Okaformbah; 22.10.2019
comment
Существует разница между .transfer и .call (), в случае кода openZepplin резервная функция, вызываемая передачей значения и данных `` контракт Test {bytes public checkBytes; function () платный внешний {checkBytes = msg.data; } функция pay (байты памяти, значение1) оплачиваемое общедоступное {адрес (это) .call.value (msg.value) (значение1); }} `` Один раз проверьте этот пример, чтобы понять код openZepplin. Данные, переданные в функцию, будут отправлены в резервную функцию. - person Dushyanth Kumar Reddy; 23.10.2019