Skip to content

Commit 004b9d2

Browse files
pyth oracle
1 parent b6b1b07 commit 004b9d2

File tree

5 files changed

+37
-1
lines changed

5 files changed

+37
-1
lines changed

.gas-snapshot

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenDepositFrozen(uint256) (r
166166
OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenMintFrozen(uint256) (runs: 256, μ: 369652, ~: 376465)
167167
OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedeemFrozen(uint256) (runs: 256, μ: 334722, ~: 340175)
168168
OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenRedepositFrozen(uint256) (runs: 256, μ: 443837, ~: 450650)
169-
OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferFroze(uint256) (runs: 257, μ: 326674, ~: 333569)
169+
OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferFroze(uint256) (runs: 256, μ: 326750, ~: 333569)
170170
OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenTransferNotFroze() (gas: 258229)
171171
OffchainAssetReceiptVaultOwnerFreezeUntilTest:testTokenWithdrawFrozen(uint256) (runs: 256, μ: 334875, ~: 340328)
172172
OffchainAssetReceiptVaultPaymentMintAuthorizerV1ConstructTest:testOffchainAssetReceiptVaultPaymentMintAuthorizerV1Construct() (gas: 2516599)

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,6 @@
2222
[submodule "lib/rain.verify.interface"]
2323
path = lib/rain.verify.interface
2424
url = https://github.com/rainlanguage/rain.verify.interface
25+
[submodule "lib/rain.pyth"]
26+
path = lib/rain.pyth
27+
url = https://github.com/rainlanguage/rain.pyth

foundry.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ remappings = [
1616
"chainlink/=lib/rain.chainlink/lib/chainlink/contracts/src/",
1717
"rain.math.fixedpoint/=lib/rain.math.fixedpoint/src/",
1818
"rain.extrospection/=lib/rain.factory/lib/rain.extrospection/src/",
19+
"rain.math.float/=lib/rain.flare/lib/rain.interpreter/lib/rain.interpreter.interface/lib/rain.math.float/src/",
1920
]
2021

2122
bytecode_hash = "none"

lib/rain.pyth

Submodule rain.pyth added at 71ea980

src/concrete/oracle/PythOracle.sol

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// SPDX-License-Identifier: LicenseRef-DCL-1.0
2+
// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd
3+
pragma solidity =0.8.25;
4+
5+
import {PriceOracleV2} from "../../abstract/PriceOracleV2.sol";
6+
import {IPyth} from "pyth-sdk/IPyth.sol";
7+
import {PythStructs} from "pyth-sdk/PythStructs.sol";
8+
import {LibDecimalFloat, Float} from "rain.math.float/lib/LibDecimalFloat.sol";
9+
10+
error NonPositivePrice(int256 price);
11+
12+
contract PythOracle is PriceOracleV2 {
13+
bytes32 public immutable I_PRICE_FEED_ID;
14+
uint256 public immutable I_STALE_AFTER;
15+
IPyth public immutable I_PYTH_CONTRACT;
16+
17+
function _price() internal virtual override returns (uint256) {
18+
PythStructs.Price memory price = I_PYTH_CONTRACT.getPriceNoOlderThan(I_PRICE_FEED_ID, I_STALE_AFTER);
19+
int256 conservativePrice = int256(price.price) - int256(uint256(price.conf));
20+
if (conservativePrice <= 0) {
21+
revert NonPositivePrice(price.price);
22+
}
23+
// It is safe to pack lossless here because the price data uses only
24+
// 64 bits while we have 224 bits for a packed signed coefficient, and
25+
// the exponent bit size is the same for both.
26+
Float conservativePriceFloat = LibDecimalFloat.packLossless(conservativePrice, price.expo);
27+
// We ignore precision loss here, truncating towards zero.
28+
(uint256 price18,) = LibDecimalFloat.toFixedDecimalLossy(conservativePriceFloat, 18);
29+
return price18;
30+
}
31+
}

0 commit comments

Comments
 (0)