Skip to content

Commit

Permalink
Merge pull request #268 from VenusProtocol/feat/reference-pendle-oracles
Browse files Browse the repository at this point in the history
[VEN-2935]: Add reference oracles for Pendle assets
  • Loading branch information
kkirka authored Feb 21, 2025
2 parents a325ad2 + a80ebf9 commit 8dbeab9
Show file tree
Hide file tree
Showing 21 changed files with 6,890 additions and 63 deletions.
29 changes: 29 additions & 0 deletions deploy/16-deploy-SolvBTC.BBN-pendle-oracles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { DeployFunction } from "hardhat-deploy/dist/types";
import { HardhatRuntimeEnvironment } from "hardhat/types";

import { ADDRESSES } from "../helpers/deploymentConfig";
import { isMainnet } from "../helpers/deploymentUtils";

enum PendleRateKind {
PT_TO_ASSET = 0,
Expand Down Expand Up @@ -53,6 +54,34 @@ const func: DeployFunction = async ({ getNamedAccounts, deployments, network }:
},
skipIfAlreadyDeployed: true,
});

if (isMainnet(network)) {
const referenceOracle = await ethers.getContract("ReferenceOracle");
const { devMultisig } = addresses;
await deploy("PendleOracle-PT-SolvBTC.BBN-27MAR2025_Reference_PtToAsset", {
contract: "PendleOracle",
from: deployer,
log: true,
deterministicDeployment: false,
args: [
addresses["PT-SolvBTC.BBN-27MAR2025_Market"] || "0x0000000000000000000000000000000000000001",
ptOracleAddress,
PendleRateKind.PT_TO_ASSET,
addresses["PT-SolvBTC.BBN-27MAR2025"],
addresses.BTCB,
referenceOracle.address,
900,
],
proxy: {
owner: devMultisig,
proxyContract: "OptimizedTransparentUpgradeableProxy",
viaAdminContract: {
name: "DevProxyAdmin",
},
},
skipIfAlreadyDeployed: true,
});
}
};

export default func;
Expand Down
137 changes: 85 additions & 52 deletions deploy/7-deploy-pendle-oracle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { DeployFunction } from "hardhat-deploy/dist/types";
import { HardhatRuntimeEnvironment } from "hardhat/types";

import { ADDRESSES } from "../helpers/deploymentConfig";
import { isMainnet } from "../helpers/deploymentUtils";

enum PendleRateKind {
PT_TO_ASSET = 0,
Expand All @@ -14,116 +15,148 @@ type OracleConfig = {
market: string;
ptToken: string;
underlyingToken: string;
yieldToken: string;
ptOracle: string;
TWAPDuration: number;
pendleRateKind: PendleRateKind;
primaryRateKind: PendleRateKind;
}[];

const deployPendleOracle = async (
deployments: HardhatRuntimeEnvironment["deployments"],
deployer: string,
name: string,
args: any[],
proxyOwnerAddress: string,
defaultProxyAdmin: any,
) => {
const { deploy } = deployments;
return deploy(name, {
contract: "PendleOracle",
from: deployer,
log: true,
deterministicDeployment: false,
args,
proxy: {
owner: proxyOwnerAddress,
proxyContract: "OptimizedTransparentUpgradeableProxy",
viaAdminContract: {
name: "DefaultProxyAdmin",
artifact: defaultProxyAdmin,
},
},
skipIfAlreadyDeployed: true,
});
};

const func: DeployFunction = async ({
getNamedAccounts,
deployments,
network,
artifacts,
}: HardhatRuntimeEnvironment) => {
const { deployer } = await getNamedAccounts();
const { deploy } = deployments;

const oracle = await ethers.getContract("ResilientOracle");
const proxyOwnerAddress = network.live ? ADDRESSES[network.name].timelock : deployer;
const defaultProxyAdmin = await artifacts.readArtifact(
const proxyAdminArtifact = await artifacts.readArtifact(
"hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/ProxyAdmin.sol:ProxyAdmin",
);

const addresses = ADDRESSES[network.name];
const fallbackAddress = "0x0000000000000000000000000000000000000001";

const deployOracles = async (oracleConfig: OracleConfig) => {
await Promise.all(
oracleConfig.map(async ({ name, market, ptToken, underlyingToken, ptOracle, TWAPDuration, pendleRateKind }) => {
const ptOracleAddress = ptOracle || (await ethers.getContract("MockPendlePtOracle")).address;
await deployPendleOracle(
deployments,
deployer,
name,
[
market || fallbackAddress,
ptOracleAddress,
pendleRateKind,
ptToken,
underlyingToken,
oracle.address,
TWAPDuration,
],
proxyOwnerAddress,
defaultProxyAdmin,
);
}),
oracleConfig.map(
async ({ name, market, ptToken, underlyingToken, yieldToken, ptOracle, TWAPDuration, primaryRateKind }) => {
const defaultProxyAdmin = await ethers.getContract("DefaultProxyAdmin");
console.log("default proxy admin owner", await defaultProxyAdmin.owner());
console.log("trying to set the owner to", proxyOwnerAddress);
console.log("Deploying main oracles");
const ptOracleAddress = ptOracle || (await ethers.getContract("MockPendlePtOracle")).address;
await deploy(name, {
contract: "PendleOracle",
from: deployer,
log: true,
deterministicDeployment: false,
skipIfAlreadyDeployed: true,
args: [
market || fallbackAddress,
ptOracleAddress,
primaryRateKind,
ptToken,
primaryRateKind === PendleRateKind.PT_TO_ASSET ? underlyingToken : yieldToken,
oracle.address,
TWAPDuration,
],
proxy: {
owner: proxyOwnerAddress,
proxyContract: "OptimizedTransparentUpgradeableProxy",
viaAdminContract: {
name: "DefaultProxyAdmin",
artifact: proxyAdminArtifact,
},
},
});
},
),
);
};

const deployReferenceOracles = async (oracleConfig: OracleConfig) => {
const devMultisig = network.live ? ADDRESSES[network.name].devMultisig : deployer;
console.log(devMultisig);
const referenceOracle = await ethers.getContract("ReferenceOracle");
for (const config of oracleConfig) {
const { name, market, ptToken, underlyingToken, yieldToken, ptOracle, TWAPDuration, primaryRateKind } = config;
const ptOracleAddress = ptOracle || (await ethers.getContract("MockPendlePtOracle")).address;
const referenceRateKind =
primaryRateKind === PendleRateKind.PT_TO_ASSET ? PendleRateKind.PT_TO_SY : PendleRateKind.PT_TO_ASSET;
console.log("Deploying", `${name}_Reference`);
await deploy(`${name}_Reference`, {
contract: "PendleOracle",
from: deployer,
log: true,
deterministicDeployment: false,
skipIfAlreadyDeployed: true,
args: [
market || fallbackAddress,
ptOracleAddress,
referenceRateKind,
ptToken,
referenceRateKind === PendleRateKind.PT_TO_ASSET ? underlyingToken : yieldToken,
referenceOracle.address,
TWAPDuration,
],
proxy: {
owner: devMultisig,
proxyContract: "OptimizedTransparentUpgradeableProxy",
viaAdminContract: {
name: "DevProxyAdmin",
artifact: proxyAdminArtifact,
},
},
});
}
};

const oracleConfig: OracleConfig = [
{
name: "PendleOracle-PT-weETH-26DEC2024",
market: addresses.PTweETH_26DEC2024_Market,
ptToken: addresses.PTweETH_26DEC2024,
underlyingToken: addresses.WETH,
yieldToken: addresses.weETH,
ptOracle: addresses.PTOracle || (await ethers.getContract("MockPendleOracle")).address,
TWAPDuration: 1800,
pendleRateKind: PendleRateKind.PT_TO_ASSET,
primaryRateKind: PendleRateKind.PT_TO_ASSET,
},
{
name: "PendleOracle_PT_USDe_27MAR2025",
market: addresses.PTUSDe_27MAR2025_Market,
ptToken: addresses.PTUSDe_27MAR2025,
underlyingToken: addresses.USDe,
yieldToken: addresses.USDe,
ptOracle:
network.name === "sepolia"
? (await ethers.getContract("MockPendleOracle_PT_USDe_27MAR2025")).address
: addresses.PTOracle,
TWAPDuration: 1800,
pendleRateKind: PendleRateKind.PT_TO_ASSET,
primaryRateKind: PendleRateKind.PT_TO_ASSET,
},
{
name: "PendleOracle_PT_sUSDe_27MAR2025",
market: addresses.PTsUSDe_27MAR2025_Market,
ptToken: addresses.PTsUSDe_27MAR2025,
underlyingToken: addresses.USDe,
yieldToken: addresses.sUSDe,
ptOracle:
network.name === "sepolia"
? (await ethers.getContract("MockPendleOracle_PT_sUSDe_27MAR2025")).address
: addresses.PTOracle,
TWAPDuration: 1800,
pendleRateKind: PendleRateKind.PT_TO_ASSET,
primaryRateKind: PendleRateKind.PT_TO_ASSET,
},
];

await deployOracles(oracleConfig);
if (isMainnet(network)) {
console.log("Deploying reference oracles");
await deployReferenceOracles(oracleConfig);
}

if (network.name === "sepolia") {
const NormalTimelock = "0xc332F7D8D5eA72cf760ED0E1c0485c8891C6E0cF"; // SEPOLIA NORMAL TIMELOCK
Expand Down
Loading

0 comments on commit 8dbeab9

Please sign in to comment.