Я новичок в солидности...
Этот
Chainlink.Request memory request = buildChainlinkRequest(clJobId, address(this), this.registerConfirm.selector);
request.add("repo", msg.sender);
говоритTypeError: Invalid type for argument in function call. Invalid implicit conversion from bytes20 to bytes memory requested.
Документы цепочки говорят мне, что есть также методы addBytes, addInt, addUint, addStringArray и setBuffer.
Моей первой мыслью было преобразовать адрес в строку, но это не кажется таким уж тривиальным. Вот и думаю, как с этим вообще справиться.
Такие ответы смущают меня, потому что в комментариях говорится, что это не то, что вы ожидаете.
Вы можете передать адрес в виде строки или uint256.
Вот функция, которая преобразует ваш адрес в строку:
function addressToString(address _address) public pure returns (string memory _uintAsString) {
uint _i = uint256(_address);
if (_i == 0) {
return "0";
}
uint j = _i;
uint len;
while (j != 0) {
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len - 1;
while (_i != 0) {
bstr[k--] = byte(uint8(48 + _i % 10));
_i /= 10;
}
return string(bstr);
}
Затем просто передайте это в свой запрос Chainlink:
Chainlink.Request memory request = buildChainlinkRequest(clJobId, address(this), this.registerConfirm.selector);
request.add("repo", addressToString(msg.sender));
Это именно то, что Вам нужно!!! Вернуть реальный адрес, а не числовое представление
Работает с Solidity ^0.6.0
function addressToString(address _address) public pure returns(string memory) {
bytes32 _bytes = bytes32(uint256(_address));
bytes memory HEX = "0123456789abcdef";
bytes memory _string = new bytes(42);
_string[0] = '0';
_string[1] = 'x';
for(uint i = 0; i < 20; i++) {
_string[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)];
_string[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)];
}
return string(_string);
}
Маркус Коттлендер
Патрик Коллинз
Анупам
Нео