Адрес не сохраняется правильно в переменной состояния?

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

См. код ниже:

pragma solidity ^0.4.19;    
contract AmbassadorTask {
    address private owner; // Address of business offering rewards for a task 
    uint taskReward; // How much ether ambassadors get every time they complete a task
    address ambassador; // Represents person allowed to complete task and claim rewards

    //Constructor
    function AmbassadorTask (address _ambassador) public payable {
            require (msg.value > 0); // No point creating tasks with no rewards
            owner = msg.sender;  // Set creator to be the owner of this contract
            taskReward = msg.value;
            ambassador = _ambassador;
    }

    function getAmbassador() public view returns (address _ambassador) {
        return ambassador;
    }
}

Код корректно компилируется в Remix, но когда я тестирую его во время выполнения с помощью JavaScriptVM, адрес «посла», хранящийся в контракте, не совпадает с адресом, который я передаю в качестве входных данных в конструкторе.

Например, я передаю 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c в качестве входных данных при вызове конструктора. Если я немедленно вызову getAmbassador(), я получу следующий вывод: 0xa4aff308fddc160c0000000000000000000000000 вместо значения, которое я ввел для создания контракта. Я также заметил, что это всего лишь последние 16 шестнадцатеричных цифр адреса, которые я передал, за которыми следуют конечные нули.

Напротив, у меня нет такой же проблемы с сохранением msg.sender в переменной состояния владельца при вызове конструктора.

Почему это происходит? Я неправильно храню значения адреса? Это проблема преобразования данных?

Заранее спасибо за вашу помощь!

Спасибо за проверку! Интересно, может ли это помочь передать адрес в виде строки, а затем преобразовать его в адрес во время конструктора, просто чтобы обойти проблему. Просто интересуюсь.

Ответы (1)

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

Я мог воспроизвести поведение, которое вы видели, только с помощью шестнадцатеричной строки без кавычек. С кавычками он работал правильно все 10 раз, когда я пытался это сделать.

Ага!!! Это сделало это. Большое спасибо. Я не могу поверить, что это был просто вопрос пропущенных кавычек. Большое спасибо за Вашу помощь!