diff --git a/hardhat.config.mainnet.ts b/hardhat.config.mainnet.ts index 6317d4d61..f49552b3a 100644 --- a/hardhat.config.mainnet.ts +++ b/hardhat.config.mainnet.ts @@ -19,6 +19,7 @@ import { MAINNET_MORPHO_BLUE_WSTETH_USDA_182DAY, MAINNET_RETH_182DAY, MAINNET_RETH_COORDINATOR, + MAINNET_SCRVUSD_182DAY, MAINNET_SGYD_182DAY, MAINNET_STUSD_182DAY, MAINNET_SUSDE_182DAY, @@ -49,6 +50,7 @@ const config: HardhatUserConfig = { MAINNET_MORPHO_BLUE_WSTETH_USDA_182DAY, MAINNET_MORPHO_BLUE_WBTC_USDC_182DAY, MAINNET_MORPHO_BLUE_CBBTC_USDC_182DAY, + MAINNET_SCRVUSD_182DAY, MAINNET_STUSD_182DAY, MAINNET_SUSDE_182DAY, MAINNET_SGYD_182DAY, diff --git a/tasks/deploy/config/mainnet/index.ts b/tasks/deploy/config/mainnet/index.ts index 607bddc8f..6b35f13bb 100644 --- a/tasks/deploy/config/mainnet/index.ts +++ b/tasks/deploy/config/mainnet/index.ts @@ -17,6 +17,7 @@ export * from "./morpho-blue-wsteth-usda-182day"; export * from "./morpho-blue-wsteth-usdc-182day"; export * from "./reth-182day"; export * from "./reth-coordinator"; +export * from "./scrvusd-182day"; export * from "./sgyd-182day"; export * from "./staking-usds-coordinator"; export * from "./staking-usds-sky-182day"; diff --git a/tasks/deploy/config/mainnet/scrvusd-182day.ts b/tasks/deploy/config/mainnet/scrvusd-182day.ts new file mode 100644 index 000000000..4c6a916ee --- /dev/null +++ b/tasks/deploy/config/mainnet/scrvusd-182day.ts @@ -0,0 +1,91 @@ +import { Address, keccak256, parseEther, toBytes } from "viem"; +import { + HyperdriveInstanceConfig, + getLinkerDetails, + normalizeFee, + parseDuration, + toBytes32, +} from "../../lib"; +import { + CRVUSD_ADDRESS_MAINNET, + SCRVUSD_ADDRESS_MAINNET, + SIX_MONTHS, +} from "../../lib/constants"; +import { MAINNET_ERC4626_COORDINATOR_NAME } from "./erc4626-coordinator"; +import { MAINNET_FACTORY_NAME } from "./factory"; + +// The name of the pool. +export const MAINNET_SCRVUSD_182DAY_NAME = + "ElementDAO 182 Day scrvUSD Hyperdrive"; + +// The initial contribution of the pool. +const CONTRIBUTION = parseEther("100"); + +export const MAINNET_SCRVUSD_182DAY: HyperdriveInstanceConfig = { + name: MAINNET_SCRVUSD_182DAY_NAME, + prefix: "ERC4626", + coordinatorAddress: async (hre) => + hre.hyperdriveDeploy.deployments.byName( + MAINNET_ERC4626_COORDINATOR_NAME, + ).address, + deploymentId: keccak256(toBytes(MAINNET_SCRVUSD_182DAY_NAME)), + salt: toBytes32("0x69420"), + extraData: "0x", + contribution: CONTRIBUTION, + // NOTE: Link to underlying scrvUSD market + // https://crvusd.curve.fi/#/ethereum/scrvUSD + fixedAPR: parseEther("0.10"), + timestretchAPR: parseEther("0.15"), + options: async (hre) => ({ + extraData: "0x", + asBase: true, + destination: (await hre.getNamedAccounts())["deployer"] as Address, + }), + // Prepare to deploy the contract by setting approvals. + prepare: async (hre) => { + let baseToken = await hre.viem.getContractAt( + "contracts/src/interfaces/IERC20.sol:IERC20", + CRVUSD_ADDRESS_MAINNET, + ); + let tx = await baseToken.write.approve([ + hre.hyperdriveDeploy.deployments.byName( + MAINNET_ERC4626_COORDINATOR_NAME, + ).address, + CONTRIBUTION, + ]); + let pc = await hre.viem.getPublicClient(); + await pc.waitForTransactionReceipt({ hash: tx }); + }, + poolDeployConfig: async (hre) => { + let factoryContract = await hre.viem.getContractAt( + "HyperdriveFactory", + hre.hyperdriveDeploy.deployments.byName(MAINNET_FACTORY_NAME) + .address, + ); + return { + baseToken: CRVUSD_ADDRESS_MAINNET, + vaultSharesToken: SCRVUSD_ADDRESS_MAINNET, + circuitBreakerDelta: parseEther("0.05"), + minimumShareReserves: parseEther("0.001"), + minimumTransactionAmount: parseEther("0.001"), + positionDuration: parseDuration(SIX_MONTHS), + checkpointDuration: parseDuration("1 day"), + timeStretch: 0n, + governance: await factoryContract.read.hyperdriveGovernance(), + feeCollector: await factoryContract.read.feeCollector(), + sweepCollector: await factoryContract.read.sweepCollector(), + checkpointRewarder: await factoryContract.read.checkpointRewarder(), + ...(await getLinkerDetails( + hre, + hre.hyperdriveDeploy.deployments.byName(MAINNET_FACTORY_NAME) + .address, + )), + fees: { + curve: parseEther("0.01"), + flat: normalizeFee(parseEther("0.0005"), SIX_MONTHS), + governanceLP: parseEther("0.15"), + governanceZombie: parseEther("0.03"), + }, + }; + }, +}; diff --git a/tasks/deploy/lib/constants.ts b/tasks/deploy/lib/constants.ts index 442f2e9fc..33e46b5f6 100644 --- a/tasks/deploy/lib/constants.ts +++ b/tasks/deploy/lib/constants.ts @@ -112,6 +112,12 @@ export const WSTETH_ADDRESS_MAINNET = export const WBTC_ADDRESS_MAINNET = "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599" as Address; +export const SCRVUSD_ADDRESS_MAINNET = + "0x0655977FEb2f289A4aB78af67BAB0d17aAb84367" as Address; + +export const CRVUSD_ADDRESS_MAINNET = + "0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E" as Address; + // ╭─────────────────────────────────────────────────────────╮ // │ Mainnet Whales │ // ╰─────────────────────────────────────────────────────────╯