-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathClient.sol
70 lines (55 loc) · 2.27 KB
/
Client.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.19;
import {IOracle} from "./interfaces/IOracle.sol";
import {RequestType} from "./utils/Constants.sol";
/**
* @notice Пример контракта, которому необходимо получать информацию о прайсе off-chain
* @dev Получает off-chain данные через специальный контракт Oracle
*/
contract Client {
/// @notice Экземпляр контракта Oracle
IOracle private _oracle;
/// @notice Приватная переменная для записи off-chain информации о прайсе
uint256 private _price;
event OracleSet(address oracle);
event PriceSet(uint256 price);
error OnlyOracle();
modifier onlyOracle {
if (msg.sender != address(_oracle)) {
revert OnlyOracle();
}
_;
}
constructor(address oracle) {
_oracle = IOracle(oracle);
emit OracleSet(oracle);
}
/**
* @notice Делает запрос за off-chain данными на контракт Oracle
* @param oracleNode Адрес от имени которого oracle node может взаимодействовать с контрактом Oracle
* Oracle node находится в off-chain пространстве
*/
function requestPrice(address oracleNode) external {
bytes memory data = abi.encode(RequestType.GET_PRICE);
_oracle.createRequest(
oracleNode,
data,
IOracle.Callback({
to: address(this),
functionSelector: Client.setPrice.selector
})
);
}
function getPrice() external view returns (uint256) {
return _price;
}
/**
* @notice Функция которая будет вызвана контрактом Oracle для обновления информации о прайсе
* @param data Набор закодированных данных, который содержат информацию о прайсе
*/
function setPrice(bytes memory data) external onlyOracle {
uint256 price = abi.decode(data, (uint256));
_price = price;
emit PriceSet(price);
}
}