-
Notifications
You must be signed in to change notification settings - Fork 25
/
chainlinkAdaptor.sol
56 lines (49 loc) · 1.69 KB
/
chainlinkAdaptor.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
/*
Copyright 2022 JOJO Exchange
SPDX-License-Identifier: BUSL-1.1
*/
pragma solidity 0.8.9;
import "@openzeppelin/contracts/utils/math/SafeCast.sol";
interface IChainlink {
function latestRoundData()
external
view
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
function latestAnswer() external view returns (int256 answer);
}
contract ChainlinkExpandAdaptor {
address public immutable chainlink;
uint256 public immutable decimalsCorrection;
uint256 public immutable heartbeatInterval;
address public immutable USDCSource;
constructor(
address _chainlink,
uint256 _decimalsCorrection,
uint256 _heartbeatInterval,
address _USDCSource
) {
chainlink = _chainlink;
decimalsCorrection = 10**_decimalsCorrection;
heartbeatInterval = _heartbeatInterval;
USDCSource = _USDCSource;
}
function getMarkPrice() external view returns (uint256 price) {
int256 rawPrice;
uint256 updatedAt;
(, rawPrice, , updatedAt, ) = IChainlink(chainlink).latestRoundData();
(, int256 USDCPrice,, uint256 USDCUpdatedAt,) = IChainlink(USDCSource).latestRoundData();
require(
block.timestamp - updatedAt <= heartbeatInterval,
"ORACLE_HEARTBEAT_FAILED"
);
require(block.timestamp - USDCUpdatedAt <= heartbeatInterval, "USDC_ORACLE_HEARTBEAT_FAILED");
uint256 tokenPrice = (SafeCast.toUint256(rawPrice) * 1e8) / SafeCast.toUint256(USDCPrice);
return tokenPrice * 1e18 / decimalsCorrection;
}
}