Skip to content

Commit 6f14df4

Browse files
authored
Merge pull request #294 from VenusProtocol/develop
New release
2 parents 0fbc3ad + eddea22 commit 6f14df4

File tree

53 files changed

+6980
-14685
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+6980
-14685
lines changed

.env.example

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ ARCHIVE_NODE_ethereum=https://eth-mainnet.nodereal.io/v1/<YOUR_KEY_HERE>
2323
#ARCHIVE_NODE_basemainnet=https://open-platform.nodereal.io/<YOUR_KEY_HERE>/base
2424
#ARCHIVE_NODE_unichainsepolia=https://unichain-sepolia.g.alchemy.com/v2/<YOUR_KEY_HERE>
2525
#ARCHIVE_NODE_unichainmainnet=https://unichain-mainnet.g.alchemy.com/v2/<YOUR_KEY_HERE>
26-
#ARCHIVE_NODE_berachainbepolia=https://berachain-bepolia.g.alchemy.com/v2/<YOUR_KEY_HERE>
2726

2827
ETHERSCAN_API_KEY=
2928
REPORT_GAS=

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ jobs:
115115

116116
- name: Export deployments
117117
run: |
118-
for NETWORK in bsctestnet bscmainnet ethereum sepolia opbnbtestnet opbnbmainnet arbitrumsepolia arbitrumone opsepolia opmainnet basesepolia basemainnet unichainsepolia unichainmainnet berachainbepolia; do
118+
for NETWORK in bsctestnet bscmainnet ethereum sepolia opbnbtestnet opbnbmainnet arbitrumsepolia arbitrumone opsepolia opmainnet basesepolia basemainnet unichainsepolia unichainmainnet; do
119119
EXPORT=true yarn hardhat export --network ${NETWORK} --export ./deployments/${NETWORK}.json
120120
jq -M '{name, chainId, addresses: .contracts | map_values(.address)}' ./deployments/${NETWORK}.json > ./deployments/${NETWORK}_addresses.json
121121
done

CHANGELOG.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,41 @@
1+
## [2.14.0-dev.2](https://github.com/VenusProtocol/oracle/compare/v2.14.0-dev.1...v2.14.0-dev.2) (2025-09-29)
2+
3+
4+
### Features
5+
6+
* add PT-USDe oracle deployemnts ([de0e156](https://github.com/VenusProtocol/oracle/commit/de0e15690cad6b713069ea9200a7a4b2d359bfef))
7+
* add PT-USDe oracle deployemnts on bscmainnet ([0428227](https://github.com/VenusProtocol/oracle/commit/042822727a1c95ef94978e32ea91333c6b6d7c0d))
8+
* updating deployment files ([f688009](https://github.com/VenusProtocol/oracle/commit/f688009a686c6d56c5b9748e23b0826cabe64d52))
9+
* updating deployment files ([7f6990a](https://github.com/VenusProtocol/oracle/commit/7f6990afe8886a559bc4a7efd8ec4794a5928e9a))
10+
* updating deployment files ([7a3baa3](https://github.com/VenusProtocol/oracle/commit/7a3baa3c98561e02b8cfeb0ca3301f91882e3ab3))
11+
* updating deployment files ([9464757](https://github.com/VenusProtocol/oracle/commit/946475775ff74d8d3fa502edb5759ad695c03f5d))
12+
13+
14+
### Bug Fixes
15+
16+
* market naming case ([b443a93](https://github.com/VenusProtocol/oracle/commit/b443a930c4d50b80012689416c3db77ae5cd2231))
17+
* update PT-USDe oracle deployemnt ([6dc42ad](https://github.com/VenusProtocol/oracle/commit/6dc42ad74f1edd9338371efdcfc81db5069e7ba8))
18+
* yarn-lock updates ([9179568](https://github.com/VenusProtocol/oracle/commit/9179568a8c423e4207e8531406a09fb42389baf8))
19+
20+
## [2.14.0-dev.1](https://github.com/VenusProtocol/oracle/compare/v2.13.0...v2.14.0-dev.1) (2025-08-11)
21+
22+
23+
### Features
24+
25+
* could use different contracts to get the wstETH ratio ([bd60eb8](https://github.com/VenusProtocol/oracle/commit/bd60eb88975228113195c0d4a1df3dabc61afb4d))
26+
* updating deployment files ([2541103](https://github.com/VenusProtocol/oracle/commit/25411038a1c2afb632d5377874349f62b98e03eb))
27+
28+
29+
### Bug Fixes
30+
31+
* added caps ([43179a0](https://github.com/VenusProtocol/oracle/commit/43179a0ddaaacb52ca3130efcbae9cd36246bb45))
32+
* deployed oracle ([0d41742](https://github.com/VenusProtocol/oracle/commit/0d4174201e5570a60c612bd831acf2ffc57bc4a9))
33+
* fixed deploy script ([e4f1e16](https://github.com/VenusProtocol/oracle/commit/e4f1e166b9edf8451caaac96e2abc12f04a1074c))
34+
* fixed ut ([6809779](https://github.com/VenusProtocol/oracle/commit/6809779b51cd4a4db0ba6c8a6620738165129966))
35+
* fixed yarn lock ([e165afc](https://github.com/VenusProtocol/oracle/commit/e165afcccf3dd5745dfff2942595aa3d72ae81a6))
36+
* removed berachain deployment ([cf0ff73](https://github.com/VenusProtocol/oracle/commit/cf0ff73bc19f1f17e48366b8aebda1ca9130f4df))
37+
* removed proxy ([549f763](https://github.com/VenusProtocol/oracle/commit/549f763fa34f4b0e708f9be6aa8649dcaae8a8cc))
38+
139
## [2.13.0](https://github.com/VenusProtocol/oracle/compare/v2.12.0...v2.13.0) (2025-07-01)
240

341

3.23 MB
Binary file not shown.

contracts/oracles/WstETHOracleV2.sol

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,24 @@ pragma solidity 0.8.25;
44
import { IStETH } from "../interfaces/IStETH.sol";
55
import { CorrelatedTokenOracle } from "./common/CorrelatedTokenOracle.sol";
66
import { EXP_SCALE } from "@venusprotocol/solidity-utilities/contracts/constants.sol";
7+
import { ensureNonzeroAddress } from "@venusprotocol/solidity-utilities/contracts/validators.sol";
78

89
/**
910
* @title WstETHOracleV2
1011
* @author Venus
1112
* @notice This oracle fetches the price of wstETH
1213
*/
1314
contract WstETHOracleV2 is CorrelatedTokenOracle {
15+
/// @notice Address of stETH
16+
IStETH public immutable STETH;
17+
1418
/// @notice Constructor for the implementation contract.
19+
/// @dev The underlyingToken must be correlated so that 1 underlyingToken is equal to 1 stETH, because
20+
/// getUnderlyingAmount() implicitly assumes that
1521
constructor(
16-
address wstETH,
1722
address stETH,
23+
address wstETH,
24+
address underlyingToken,
1825
address resilientOracle,
1926
uint256 annualGrowthRate,
2027
uint256 _snapshotInterval,
@@ -25,7 +32,7 @@ contract WstETHOracleV2 is CorrelatedTokenOracle {
2532
)
2633
CorrelatedTokenOracle(
2734
wstETH,
28-
stETH,
35+
underlyingToken,
2936
resilientOracle,
3037
annualGrowthRate,
3138
_snapshotInterval,
@@ -34,13 +41,16 @@ contract WstETHOracleV2 is CorrelatedTokenOracle {
3441
accessControlManager,
3542
_snapshotGap
3643
)
37-
{}
44+
{
45+
ensureNonzeroAddress(stETH);
46+
STETH = IStETH(stETH);
47+
}
3848

3949
/**
40-
* @notice Gets the stETH for 1 wstETH
41-
* @return amount Amount of stETH
50+
* @notice Gets the amount of underlyingToken for 1 wstETH, assuming that 1 underlyingToken is equivalent to 1 stETH
51+
* @return amount Amount of underlyingToken
4252
*/
4353
function getUnderlyingAmount() public view override returns (uint256) {
44-
return IStETH(UNDERLYING_TOKEN).getPooledEthByShares(EXP_SCALE);
54+
return STETH.getPooledEthByShares(EXP_SCALE);
4555
}
4656
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { ethers } from "hardhat";
2+
import { DeployFunction } from "hardhat-deploy/dist/types";
3+
import { HardhatRuntimeEnvironment } from "hardhat/types";
4+
5+
import { ADDRESSES } from "../helpers/deploymentConfig";
6+
import { isMainnet } from "../helpers/deploymentUtils";
7+
8+
enum PendleRateKind {
9+
PT_TO_ASSET = 0,
10+
PT_TO_SY = 1,
11+
}
12+
13+
const func: DeployFunction = async ({ getNamedAccounts, deployments, network }: HardhatRuntimeEnvironment) => {
14+
const { deploy } = deployments;
15+
const { deployer } = await getNamedAccounts();
16+
17+
const resilientOracle = await ethers.getContract("ResilientOracle");
18+
const addresses = ADDRESSES[network.name];
19+
const ptOracleAddress = addresses.PTOracle || (await ethers.getContract("MockPendlePtOracle")).address;
20+
21+
const commonParams = {
22+
from: deployer,
23+
log: true,
24+
deterministicDeployment: false,
25+
skipIfAlreadyDeployed: true,
26+
waitConfirmations: 1,
27+
};
28+
29+
await deploy("PendleOracle-PT-USDe-30OCT2025", {
30+
contract: "PendleOracle",
31+
args: [
32+
{
33+
market: addresses["PT-USDe-30OCT2025_Market"] || "0x0000000000000000000000000000000000000004",
34+
ptOracle: ptOracleAddress,
35+
rateKind: PendleRateKind.PT_TO_SY,
36+
ptToken: addresses["PT-USDe-30OCT2025"],
37+
underlyingToken: addresses.USDe,
38+
resilientOracle: resilientOracle.address,
39+
twapDuration: 1800,
40+
annualGrowthRate: 0,
41+
snapshotInterval: 0,
42+
initialSnapshotMaxExchangeRate: 0,
43+
initialSnapshotTimestamp: 0,
44+
accessControlManager: addresses.acm,
45+
snapshotGap: 0,
46+
},
47+
],
48+
...commonParams,
49+
});
50+
51+
if (isMainnet(network)) {
52+
await deploy("PendleOracle-PT-USDe-30OCT2025_Reference_PtToAsset", {
53+
contract: "PendleOracle",
54+
from: deployer,
55+
log: true,
56+
deterministicDeployment: false,
57+
args: [
58+
{
59+
market: addresses["PT-USDe-30OCT2025_Market"] || "0x0000000000000000000000000000000000000004",
60+
ptOracle: ptOracleAddress,
61+
rateKind: PendleRateKind.PT_TO_ASSET,
62+
ptToken: addresses["PT-USDe-30OCT2025"],
63+
underlyingToken: addresses.USDe,
64+
resilientOracle: resilientOracle.address,
65+
twapDuration: 1800,
66+
annualGrowthRate: 0,
67+
snapshotInterval: 0,
68+
initialSnapshotMaxExchangeRate: 0,
69+
initialSnapshotTimestamp: 0,
70+
accessControlManager: addresses.acm,
71+
snapshotGap: 0,
72+
},
73+
],
74+
skipIfAlreadyDeployed: true,
75+
});
76+
}
77+
};
78+
79+
export default func;
80+
func.tags = ["PT-USDe"];
81+
func.skip = async (hre: HardhatRuntimeEnvironment) =>
82+
hre.network.name !== "bsctestnet" && hre.network.name !== "bscmainnet";

deploy/6-deploy-wstETH-oracle.ts

Lines changed: 75 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,96 @@
1+
import { BigNumber } from "ethers";
2+
import { parseUnits } from "ethers/lib/utils";
13
import { ethers } from "hardhat";
24
import { DeployFunction } from "hardhat-deploy/dist/types";
35
import { HardhatRuntimeEnvironment } from "hardhat/types";
46

5-
import { ADDRESSES, addr0000, assets } from "../helpers/deploymentConfig";
7+
import {
8+
ADDRESSES,
9+
DAYS_30,
10+
addr0000,
11+
assets,
12+
getSnapshotGap,
13+
increaseExchangeRateByPercentage,
14+
} from "../helpers/deploymentConfig";
615

7-
const func: DeployFunction = async ({
8-
getNamedAccounts,
9-
deployments,
10-
network,
11-
artifacts,
12-
}: HardhatRuntimeEnvironment) => {
16+
const func: DeployFunction = async ({ getNamedAccounts, deployments, network }: HardhatRuntimeEnvironment) => {
1317
const { deploy } = deployments;
1418
const { deployer } = await getNamedAccounts();
1519

16-
console.log(`Deployer ${deployer}`);
17-
18-
const proxyOwnerAddress = network.live ? ADDRESSES[network.name].timelock : deployer;
19-
20-
const { stETHAddress, wstETHAddress } = ADDRESSES[network.name];
20+
const { stETHAddress, wstETHAddress, acm } = ADDRESSES[network.name];
2121
const WETHAsset = assets[network.name].find(asset => asset.token === "WETH");
2222
const WETHAddress = WETHAsset?.address ?? addr0000;
2323

24-
const defaultProxyAdmin = await artifacts.readArtifact(
25-
"hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/ProxyAdmin.sol:ProxyAdmin",
26-
);
27-
2824
const oracle = await ethers.getContract("ResilientOracle");
2925

3026
// Equivalence and NonEquivalence is related to if the oracle will
3127
// assume 1/1 price ration between stETH/ETH or
3228
// will get stETH/USD price from secondary market
3329

34-
await deploy("WstETHOracle_Equivalence", {
35-
contract: "WstETHOracle",
36-
from: deployer,
37-
log: true,
38-
deterministicDeployment: false,
39-
args: [wstETHAddress, WETHAddress, stETHAddress, oracle.address, true],
40-
proxy: {
41-
owner: proxyOwnerAddress,
42-
proxyContract: "OptimizedTransparentUpgradeableProxy",
43-
viaAdminContract: {
44-
name: "DefaultProxyAdmin",
45-
artifact: defaultProxyAdmin,
46-
},
47-
},
48-
});
30+
const wstETH_ANNUAL_GROWTH_RATE = ethers.utils.parseUnits("0.067", 18); // 6.7%
31+
const block = await ethers.provider.getBlock("latest");
32+
const stETHContract = await ethers.getContractAt("IStETH", stETHAddress);
33+
const exchangeRate = await stETHContract.getPooledEthByShares(parseUnits("1", 18));
34+
const snapshotGap = BigNumber.from("55"); // 0.55%
35+
36+
if (network.name === "ethereum") {
37+
await deploy("WstETHOracle_Equivalence", {
38+
contract: "WstETHOracleV2",
39+
from: deployer,
40+
log: true,
41+
deterministicDeployment: false,
42+
args: [
43+
stETHAddress,
44+
wstETHAddress,
45+
WETHAddress,
46+
oracle.address,
47+
wstETH_ANNUAL_GROWTH_RATE,
48+
DAYS_30,
49+
increaseExchangeRateByPercentage(exchangeRate, snapshotGap),
50+
block.timestamp,
51+
acm,
52+
getSnapshotGap(exchangeRate, snapshotGap.toNumber()),
53+
],
54+
});
4955

50-
await deploy("WstETHOracle_NonEquivalence", {
51-
contract: "WstETHOracle",
52-
from: deployer,
53-
log: true,
54-
deterministicDeployment: false,
55-
args: [wstETHAddress, WETHAddress, stETHAddress, oracle.address, false],
56-
proxy: {
57-
owner: proxyOwnerAddress,
58-
proxyContract: "OptimizedTransparentUpgradeableProxy",
59-
viaAdminContract: {
60-
name: "DefaultProxyAdmin",
61-
artifact: defaultProxyAdmin,
62-
},
63-
},
64-
});
56+
await deploy("WstETHOracle_NonEquivalence", {
57+
contract: "WstETHOracleV2",
58+
from: deployer,
59+
log: true,
60+
deterministicDeployment: false,
61+
args: [
62+
stETHAddress,
63+
wstETHAddress,
64+
stETHAddress,
65+
oracle.address,
66+
wstETH_ANNUAL_GROWTH_RATE,
67+
DAYS_30,
68+
increaseExchangeRateByPercentage(exchangeRate, snapshotGap),
69+
block.timestamp,
70+
acm,
71+
getSnapshotGap(exchangeRate, snapshotGap.toNumber()),
72+
],
73+
});
74+
} else {
75+
await deploy("WstETHOracle", {
76+
contract: "WstETHOracleV2",
77+
from: deployer,
78+
log: true,
79+
deterministicDeployment: false,
80+
args: [
81+
stETHAddress,
82+
wstETHAddress,
83+
WETHAddress,
84+
oracle.address,
85+
wstETH_ANNUAL_GROWTH_RATE,
86+
DAYS_30,
87+
increaseExchangeRateByPercentage(exchangeRate, snapshotGap),
88+
block.timestamp,
89+
acm,
90+
getSnapshotGap(exchangeRate, snapshotGap.toNumber()),
91+
],
92+
});
93+
}
6594
};
6695

6796
export default func;

0 commit comments

Comments
 (0)