вызов другого контракта в браузере ремиксов не работает должным образом

Я не эксперт в Solidity. Я пытаюсь вызвать функцию для другого контракта, чтобы она обновляла значения, но это не так. Я использую онлайн Remix Browser. Контракт, который будет называться Высшим. Я вижу, что значения геттера и сеттера работают, как и ожидалось. Контракт вызывающего абонента — Hack. Если функция Sneak из Contract Hack отправляет на 1 эфир больше, чем значение стоимости, то отправитель становится большим. Например, если Sneak вызывает функцию Supreme со Стоимостью = 2 эфира, то Стоимость становится равной 2, а отправитель заменяет позицию «большой». Когда я передаю адрес из первого контракта в контракт Caller и даю 2 эфира в стоимости. Кликаю на сеттер, потом проверяю стоимость, остается 1 эфир. Я пробовал так много способов, но я не могу двигаться вперед.

contract Supreme {
    address public big;
    uint256 public cost;

    function Supreme() 
      public
    {
        big = msg.sender;
        cost = 3 ether;
    }

    function Road() 
      external
      payable
    {
        require(msg.value >= cost);
        big.transfer(msg.value);
        big = msg.sender;

        cost += 1 ether;
    }
}

Это контракт вызывающего абонента

    import "browser/Supreme.sol";
contract Hack{
Supreme public sup;

Supreme s;
function Hack(Supreme _sup){
    sup = _sup;
}
function sneak(address addr) public payable{
 s.Road.value(msg.value)();
  }
   function() payable{
   s.Road(); 
   }  
}

Ответы (1)

Две проблемы:

  1. Не похоже, что вы когда-либо создавали экземпляр Supreme, поэтому я считаю, что вы пытаетесь отправить эти вызовы функций на адрес 0.
  2. Вы не отправляете эфир, когда звоните s.Road().

Для первой проблемы вы можете либо развернуть свой контракт Supreme:

sup = new Supreme();

или (что более вероятно, что вы хотите) вы можете развернуть Supremeсебя, а затем передать адрес развернутого контракта Hackв конструкторе:

function Hack(Supreme _sup) {
    sup = _sup;
}

Чтобы решить вторую проблему, добавьте значение к вашему вызову:

s.Road.value(msg.value)();

РЕДАКТИРОВАТЬ

Ваш новый код имеет другие проблемы. Он отслеживает sup, но затем не использует его. Функция sneakтакже принимает адрес, который не используется.

Вот фиксированный код. Обязательно передайте адрес развернутого Supremeконтракта при создании Hack. Это означает, что вам нужно ввести адрес этого контракта (например "0x123abc...", ) в текстовое поле рядом с кнопкой «Создать». Затем отправьте эфир, изменив valueполе справа вверху при вызове sneakфункции.

import "browser/Supreme.sol";
contract Hack {
    Supreme public sup;

    function Hack(Supreme _sup) public {
        sup = _sup;
    }

    function sneak() public payable {
        sup.Road.value(msg.value)();
    }
}
Спасибо @smarx. Я изменил Hack контракт, как вы посоветовали. Тем не менее, я все еще не могу увидеть ожидаемых результатов. Я заметил, что в левой части браузера ремиксов появляется ошибка, которая появляется, когда я нажимаю установщик «Sneak». Передаю адрес и 3 эфира. Вот ошибка: транзакция с Hack.sneak errored: Аргументы кодирования ошибки: SyntaxError: JSON.parse: ожидается ',' или ']' после элемента массива в строке 1 столбца 3 данных JSON
Если я предоставлю только эфиры (3) и не передам адрес в качестве входных данных для Hack, предполагая, что Hack, вероятно, подберет адрес автоматически, тогда я получу следующую ошибку: транзакция для Hack.sneak errored: VM error: revert. revert Транзакция была возвращена в исходное состояние. Примечание. Конструктор должен быть оплачен, если вы отправляете значение. Отладьте транзакцию, чтобы получить больше информации
Смотрите мою правку. Я запутался в том, что вы пробовали, но, надеюсь, мой обновленный код вам поможет.
Спасибо @smarx. Я использовал тот же код, который вы указали выше. Когда я нажимаю кнопку «Создать» после предоставления адреса, скопированного из контракта Supreme. Он не показывает мне тайком или каким-либо сеттером/геттером. Вместо этого я получаю следующую ошибку: создание Hack ошибочно: аргументы кодирования ошибки: SyntaxError: JSON.parse: ожидается ',' или ']' после элемента массива в строке 1 столбца 3 данных JSON
Можете ли вы сказать мне, что именно вы вводите в поле рядом с «Создать»? Это должна быть шестнадцатеричная строка, начинающаяся с 0xи заключенная в двойные кавычки.
Я помещаю 0xdc04977a2078c8ffdf086d618d1f961b6c546222 в поле рядом с «Создать». Я скопировал его из «Верховного по адресу 0xdc04977a2078c8ffdf086d618d1f961b6c546222 (память)».
Вам не хватает двойных кавычек? Вы уверены, что развертываете правильный контракт ( Hack)? Вы уверены, что Hackпринимает только один параметр конструктора?
да, двойная кавычка отсутствовала. Я не знал об этом. Большое спасибо за решение моей проблемы.