From 93d893ad7d1ba90a834d7b5e1a319136defdbe67 Mon Sep 17 00:00:00 2001 From: MazyGio Date: Fri, 15 Nov 2024 11:20:35 -0500 Subject: [PATCH 1/8] add scrvUSD instance test --- test/instances/erc4626/ScrvUSD.t.sol | 148 +++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 test/instances/erc4626/ScrvUSD.t.sol diff --git a/test/instances/erc4626/ScrvUSD.t.sol b/test/instances/erc4626/ScrvUSD.t.sol new file mode 100644 index 000000000..dd180e444 --- /dev/null +++ b/test/instances/erc4626/ScrvUSD.t.sol @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.22; +import { console2 as console } from "forge-std/console2.sol"; + +import { stdStorage, StdStorage } from "forge-std/Test.sol"; +import { IERC20 } from "../../../contracts/src/interfaces/IERC20.sol"; +import { IERC4626 } from "../../../contracts/src/interfaces/IERC4626.sol"; +import { IHyperdrive } from "../../../contracts/src/interfaces/IHyperdrive.sol"; +import { HyperdriveUtils } from "../../utils/HyperdriveUtils.sol"; +import { InstanceTest } from "../../utils/InstanceTest.sol"; +import { Lib } from "../../utils/Lib.sol"; +import { ERC4626HyperdriveInstanceTest } from "./ERC4626HyperdriveInstanceTest.t.sol"; + +interface ISCRVUSD { + function lastProfitUpdate() external view returns (uint256); + function fullProfitUnlockDate() external view returns (uint256); +} + +contract scrvUSDHyperdriveTest is ERC4626HyperdriveInstanceTest { + using HyperdriveUtils for uint256; + using HyperdriveUtils for IHyperdrive; + using Lib for *; + using stdStorage for StdStorage; + + /// @dev The crvUSD contract. + IERC20 internal constant CRVUSD = + IERC20(0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E); + + /// @dev The scrvUSD contract. + IERC4626 internal constant SCRVUSD = + IERC4626(0x0655977FEb2f289A4aB78af67BAB0d17aAb84367); + + /// @dev Whale accounts. + address internal CRVUSD_TOKEN_WHALE = + address(0x0a7b9483030994016567b3B1B4bbB865578901Cb); + address[] internal baseTokenWhaleAccounts = [CRVUSD_TOKEN_WHALE]; + address internal SCRVUSD_TOKEN_WHALE = + address(0x3Da232a0c0A5C59918D7B5fF77bf1c8Fc93aeE1B); + address[] internal vaultSharesTokenWhaleAccounts = [SCRVUSD_TOKEN_WHALE]; + + /// @notice Instantiates the instance testing suite with the configuration. + constructor() + InstanceTest( + InstanceTestConfig({ + name: "Hyperdrive", + kind: "ERC4626Hyperdrive", + decimals: 18, + baseTokenWhaleAccounts: baseTokenWhaleAccounts, + vaultSharesTokenWhaleAccounts: vaultSharesTokenWhaleAccounts, + baseToken: CRVUSD, + vaultSharesToken: SCRVUSD, + shareTolerance: 1e3, + minimumShareReserves: 1e15, + minimumTransactionAmount: 1e15, + positionDuration: POSITION_DURATION, + fees: IHyperdrive.Fees({ + curve: 0, + flat: 0, + governanceLP: 0, + governanceZombie: 0 + }), + enableBaseDeposits: true, + enableShareDeposits: true, + enableBaseWithdraws: true, + enableShareWithdraws: true, + baseWithdrawError: new bytes(0), + isRebasing: false, + shouldAccrueInterest: true, + // The base test tolerances. + closeLongWithBaseTolerance: 20, + roundTripLpInstantaneousWithBaseTolerance: 1e5, + roundTripLpWithdrawalSharesWithBaseTolerance: 1e6, + roundTripLongInstantaneousWithBaseUpperBoundTolerance: 1e3, + roundTripLongInstantaneousWithBaseTolerance: 1e5, + roundTripLongMaturityWithBaseUpperBoundTolerance: 1e3, + roundTripLongMaturityWithBaseTolerance: 1e5, + roundTripShortInstantaneousWithBaseUpperBoundTolerance: 1e3, + roundTripShortInstantaneousWithBaseTolerance: 1e5, + roundTripShortMaturityWithBaseTolerance: 1e5, + // The share test tolerances. + closeLongWithSharesTolerance: 20, + closeShortWithSharesTolerance: 100, + roundTripLpInstantaneousWithSharesTolerance: 1e7, + roundTripLpWithdrawalSharesWithSharesTolerance: 1e7, + roundTripLongInstantaneousWithSharesUpperBoundTolerance: 1e3, + roundTripLongInstantaneousWithSharesTolerance: 1e5, + roundTripLongMaturityWithSharesUpperBoundTolerance: 1e3, + roundTripLongMaturityWithSharesTolerance: 1e5, + roundTripShortInstantaneousWithSharesUpperBoundTolerance: 1e3, + roundTripShortInstantaneousWithSharesTolerance: 1e5, + roundTripShortMaturityWithSharesTolerance: 1e5, + // The verification tolerances. + verifyDepositTolerance: 2, + verifyWithdrawalTolerance: 2 + }) + ) + {} + + /// @notice Forge function that is invoked to setup the testing environment. + function setUp() public override __mainnet_fork(21_188_049) { + // Invoke the Instance testing suite setup. + super.setUp(); + } + + /// Helpers /// + + /// @dev Advance time and accrue interest. + /// @param timeDelta The time to advance. + /// @param variableRate The variable rate. + function advanceTime( + uint256 timeDelta, + int256 variableRate + ) internal override { + // Get the total assets before advancing time. + uint256 totalAssets = SCRVUSD.totalAssets(); + uint256 totalSupply = SCRVUSD.totalSupply(); + console.log("totalAssets before: ", totalAssets); + console.log("totalSupply before: ", totalSupply); + + // Advance the time. + vm.warp(block.timestamp + timeDelta); + + // Accrue interest in the scrvUSD market. This amounts to manually + // updating the total supply assets by updating the crvUSD balance of + // scrvUSD. + (totalAssets, ) = totalAssets.calculateInterest( + variableRate, + timeDelta + ); + + // scrvUSD profits can be unlocked over a period of time, which affects + // the totalSupply and pricePerShare according to the unlocking rate. + // We exclude this factor by updating the unlock date and lastProfitUpdate + // according to the timeDelta. + + uint256 fullProfitUnlockDate = ISCRVUSD(address(SCRVUSD)).fullProfitUnlockDate(); + uint256 lastProfitUpdate = ISCRVUSD(address(SCRVUSD)).lastProfitUpdate(); + + bytes32 fullProfitLocation = bytes32(uint256(38)); + bytes32 lastProfitLocation = bytes32(uint256(40)); + + vm.store(address(SCRVUSD), fullProfitLocation, bytes32(fullProfitUnlockDate + timeDelta)); + vm.store(address(SCRVUSD), lastProfitLocation, bytes32(lastProfitUpdate + timeDelta)); + + bytes32 idleLocation = bytes32(uint256(22)); + vm.store(address(SCRVUSD), idleLocation, bytes32(totalAssets)); + } +} From 75b7b5ac23b3aa72c5b6777b5b56cfa001a727bd Mon Sep 17 00:00:00 2001 From: MazyGio Date: Fri, 15 Nov 2024 11:26:46 -0500 Subject: [PATCH 2/8] linting fixes and remove console import --- test/instances/erc4626/ScrvUSD.t.sol | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/test/instances/erc4626/ScrvUSD.t.sol b/test/instances/erc4626/ScrvUSD.t.sol index dd180e444..4553d1a5d 100644 --- a/test/instances/erc4626/ScrvUSD.t.sol +++ b/test/instances/erc4626/ScrvUSD.t.sol @@ -1,6 +1,5 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity 0.8.22; -import { console2 as console } from "forge-std/console2.sol"; import { stdStorage, StdStorage } from "forge-std/Test.sol"; import { IERC20 } from "../../../contracts/src/interfaces/IERC20.sol"; @@ -133,14 +132,24 @@ contract scrvUSDHyperdriveTest is ERC4626HyperdriveInstanceTest { // We exclude this factor by updating the unlock date and lastProfitUpdate // according to the timeDelta. - uint256 fullProfitUnlockDate = ISCRVUSD(address(SCRVUSD)).fullProfitUnlockDate(); - uint256 lastProfitUpdate = ISCRVUSD(address(SCRVUSD)).lastProfitUpdate(); + uint256 fullProfitUnlockDate = ISCRVUSD(address(SCRVUSD)) + .fullProfitUnlockDate(); + uint256 lastProfitUpdate = ISCRVUSD(address(SCRVUSD)) + .lastProfitUpdate(); bytes32 fullProfitLocation = bytes32(uint256(38)); bytes32 lastProfitLocation = bytes32(uint256(40)); - vm.store(address(SCRVUSD), fullProfitLocation, bytes32(fullProfitUnlockDate + timeDelta)); - vm.store(address(SCRVUSD), lastProfitLocation, bytes32(lastProfitUpdate + timeDelta)); + vm.store( + address(SCRVUSD), + fullProfitLocation, + bytes32(fullProfitUnlockDate + timeDelta) + ); + vm.store( + address(SCRVUSD), + lastProfitLocation, + bytes32(lastProfitUpdate + timeDelta) + ); bytes32 idleLocation = bytes32(uint256(22)); vm.store(address(SCRVUSD), idleLocation, bytes32(totalAssets)); From 40a58cf5704f0e1e88ea6e3f5995dde4d1e17b03 Mon Sep 17 00:00:00 2001 From: MazyGio Date: Fri, 15 Nov 2024 12:00:40 -0500 Subject: [PATCH 3/8] remove console logs --- test/instances/erc4626/ScrvUSD.t.sol | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/instances/erc4626/ScrvUSD.t.sol b/test/instances/erc4626/ScrvUSD.t.sol index 4553d1a5d..31af95bab 100644 --- a/test/instances/erc4626/ScrvUSD.t.sol +++ b/test/instances/erc4626/ScrvUSD.t.sol @@ -112,9 +112,6 @@ contract scrvUSDHyperdriveTest is ERC4626HyperdriveInstanceTest { ) internal override { // Get the total assets before advancing time. uint256 totalAssets = SCRVUSD.totalAssets(); - uint256 totalSupply = SCRVUSD.totalSupply(); - console.log("totalAssets before: ", totalAssets); - console.log("totalSupply before: ", totalSupply); // Advance the time. vm.warp(block.timestamp + timeDelta); From 67acb1e659a32aaceffe7640dd2198bd132dda0f Mon Sep 17 00:00:00 2001 From: MazyGio Date: Sat, 16 Nov 2024 10:28:55 -0500 Subject: [PATCH 4/8] add scrvusd 182day deployment script --- hardhat.config.mainnet.ts | 1 + tasks/deploy/config/mainnet/index.ts | 1 + tasks/deploy/config/mainnet/scrvusd-182day.ts | 90 +++++++++++++++++++ tasks/deploy/lib/constants.ts | 6 ++ 4 files changed, 98 insertions(+) create mode 100644 tasks/deploy/config/mainnet/scrvusd-182day.ts diff --git a/hardhat.config.mainnet.ts b/hardhat.config.mainnet.ts index 1d0cf4df3..760d35c83 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_STUSD_182DAY, MAINNET_SUSDE_182DAY, } from "./tasks/deploy/config/mainnet"; diff --git a/tasks/deploy/config/mainnet/index.ts b/tasks/deploy/config/mainnet/index.ts index e519d6488..45f9d6472 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 "./staking-usds-coordinator"; export * from "./staking-usds-sky-182day"; export * from "./steth-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..14fa51f7f --- /dev/null +++ b/tasks/deploy/config/mainnet/scrvusd-182day.ts @@ -0,0 +1,90 @@ +import { Address, keccak256, parseEther, toBytes } from "viem"; +import { + HyperdriveInstanceConfig, + getLinkerDetails, + normalizeFee, + parseDuration, + toBytes32, +} from "../../lib"; +import { + SIX_MONTHS, + SCRVUSD_ADDRESS_MAINNET, + CRVUSD_ADDRESS_MAINNET, +} 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<"ERC4626"> = { + 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.15"), + 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.governance(), + 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 a2538d385..2e699dd8e 100644 --- a/tasks/deploy/lib/constants.ts +++ b/tasks/deploy/lib/constants.ts @@ -106,6 +106,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 │ // ╰─────────────────────────────────────────────────────────╯ From 3cad9073ca702a3affd9c1199447107fca82b333 Mon Sep 17 00:00:00 2001 From: MazyGio Date: Sat, 16 Nov 2024 11:21:31 -0500 Subject: [PATCH 5/8] update fixedAPR to a valid amount --- hardhat.config.mainnet.ts | 5 +- tasks/deploy/config/mainnet/scrvusd-182day.ts | 129 +++++++++--------- 2 files changed, 69 insertions(+), 65 deletions(-) diff --git a/hardhat.config.mainnet.ts b/hardhat.config.mainnet.ts index 760d35c83..a055ff40f 100644 --- a/hardhat.config.mainnet.ts +++ b/hardhat.config.mainnet.ts @@ -47,8 +47,9 @@ const config: HardhatUserConfig = { MAINNET_MORPHO_BLUE_SUSDE_DAI_182DAY, MAINNET_MORPHO_BLUE_USDE_DAI_182DAY, MAINNET_MORPHO_BLUE_WSTETH_USDA_182DAY, - MAINNET_MORPHO_BLUE_WBTC_USDC_182DAY, - MAINNET_MORPHO_BLUE_CBBTC_USDC_182DAY, + // MAINNET_MORPHO_BLUE_WBTC_USDC_182DAY, + // MAINNET_MORPHO_BLUE_CBBTC_USDC_182DAY, + MAINNET_SCRVUSD_182DAY, MAINNET_STUSD_182DAY, MAINNET_SUSDE_182DAY, ], diff --git a/tasks/deploy/config/mainnet/scrvusd-182day.ts b/tasks/deploy/config/mainnet/scrvusd-182day.ts index 14fa51f7f..d265d48ef 100644 --- a/tasks/deploy/config/mainnet/scrvusd-182day.ts +++ b/tasks/deploy/config/mainnet/scrvusd-182day.ts @@ -20,71 +20,74 @@ export const MAINNET_SCRVUSD_182DAY_NAME = "ElementDAO 182 Day scrvUSD Hyperdriv // The initial contribution of the pool. const CONTRIBUTION = parseEther("100"); -export const MAINNET_SCRVUSD_182DAY: HyperdriveInstanceConfig<"ERC4626"> = { - 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.15"), - 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([ +export const MAINNET_SCRVUSD_182DAY: HyperdriveInstanceConfig<"ERC4626"> = + { + name: MAINNET_SCRVUSD_182DAY_NAME, + prefix: "ERC4626", + coordinatorAddress: async (hre) => 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.governance(), - feeCollector: await factoryContract.read.feeCollector(), - sweepCollector: await factoryContract.read.sweepCollector(), - checkpointRewarder: await factoryContract.read.checkpointRewarder(), - ...(await getLinkerDetails( - hre, + 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, - )), - fees: { - curve: parseEther("0.01"), - flat: normalizeFee(parseEther("0.0005"), SIX_MONTHS), - governanceLP: parseEther("0.15"), - governanceZombie: parseEther("0.03"), - }, - }; - }, -}; + ); + 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"), + }, + }; + }, + }; From d46356c8862631ecd1e7050619720ba2f555ed68 Mon Sep 17 00:00:00 2001 From: MazyGio Date: Mon, 18 Nov 2024 00:58:06 -0500 Subject: [PATCH 6/8] linting fixes --- hardhat.config.mainnet.ts | 2 - tasks/deploy/config/mainnet/scrvusd-182day.ts | 140 +++++++++--------- 2 files changed, 69 insertions(+), 73 deletions(-) diff --git a/hardhat.config.mainnet.ts b/hardhat.config.mainnet.ts index a055ff40f..5a9b7d9aa 100644 --- a/hardhat.config.mainnet.ts +++ b/hardhat.config.mainnet.ts @@ -11,11 +11,9 @@ import { MAINNET_EZETH_182DAY, MAINNET_EZETH_COORDINATOR, MAINNET_FACTORY, - MAINNET_MORPHO_BLUE_CBBTC_USDC_182DAY, MAINNET_MORPHO_BLUE_COORDINATOR, MAINNET_MORPHO_BLUE_SUSDE_DAI_182DAY, MAINNET_MORPHO_BLUE_USDE_DAI_182DAY, - MAINNET_MORPHO_BLUE_WBTC_USDC_182DAY, MAINNET_MORPHO_BLUE_WSTETH_USDA_182DAY, MAINNET_RETH_182DAY, MAINNET_RETH_COORDINATOR, diff --git a/tasks/deploy/config/mainnet/scrvusd-182day.ts b/tasks/deploy/config/mainnet/scrvusd-182day.ts index d265d48ef..a03dd7e6c 100644 --- a/tasks/deploy/config/mainnet/scrvusd-182day.ts +++ b/tasks/deploy/config/mainnet/scrvusd-182day.ts @@ -7,87 +7,85 @@ import { toBytes32, } from "../../lib"; import { - SIX_MONTHS, - SCRVUSD_ADDRESS_MAINNET, 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"; +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<"ERC4626"> = - { - name: MAINNET_SCRVUSD_182DAY_NAME, - prefix: "ERC4626", - coordinatorAddress: async (hre) => +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, + 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", + 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, - ); - 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"), - }, - }; - }, - }; + .address + )), + fees: { + curve: parseEther("0.01"), + flat: normalizeFee(parseEther("0.0005"), SIX_MONTHS), + governanceLP: parseEther("0.15"), + governanceZombie: parseEther("0.03"), + }, + }; + }, +}; From cafa5bbed5dd75771ae0fe13395b0469fbdda7fb Mon Sep 17 00:00:00 2001 From: MazyGio Date: Mon, 18 Nov 2024 10:04:35 -0500 Subject: [PATCH 7/8] linting fixes --- tasks/deploy/config/mainnet/scrvusd-182day.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tasks/deploy/config/mainnet/scrvusd-182day.ts b/tasks/deploy/config/mainnet/scrvusd-182day.ts index a03dd7e6c..4c6a916ee 100644 --- a/tasks/deploy/config/mainnet/scrvusd-182day.ts +++ b/tasks/deploy/config/mainnet/scrvusd-182day.ts @@ -26,7 +26,7 @@ export const MAINNET_SCRVUSD_182DAY: HyperdriveInstanceConfig = { prefix: "ERC4626", coordinatorAddress: async (hre) => hre.hyperdriveDeploy.deployments.byName( - MAINNET_ERC4626_COORDINATOR_NAME + MAINNET_ERC4626_COORDINATOR_NAME, ).address, deploymentId: keccak256(toBytes(MAINNET_SCRVUSD_182DAY_NAME)), salt: toBytes32("0x69420"), @@ -45,11 +45,11 @@ export const MAINNET_SCRVUSD_182DAY: HyperdriveInstanceConfig = { prepare: async (hre) => { let baseToken = await hre.viem.getContractAt( "contracts/src/interfaces/IERC20.sol:IERC20", - CRVUSD_ADDRESS_MAINNET + CRVUSD_ADDRESS_MAINNET, ); let tx = await baseToken.write.approve([ hre.hyperdriveDeploy.deployments.byName( - MAINNET_ERC4626_COORDINATOR_NAME + MAINNET_ERC4626_COORDINATOR_NAME, ).address, CONTRIBUTION, ]); @@ -60,7 +60,7 @@ export const MAINNET_SCRVUSD_182DAY: HyperdriveInstanceConfig = { let factoryContract = await hre.viem.getContractAt( "HyperdriveFactory", hre.hyperdriveDeploy.deployments.byName(MAINNET_FACTORY_NAME) - .address + .address, ); return { baseToken: CRVUSD_ADDRESS_MAINNET, @@ -78,7 +78,7 @@ export const MAINNET_SCRVUSD_182DAY: HyperdriveInstanceConfig = { ...(await getLinkerDetails( hre, hre.hyperdriveDeploy.deployments.byName(MAINNET_FACTORY_NAME) - .address + .address, )), fees: { curve: parseEther("0.01"), From 5301c59fdeca94532c5d8f511551c411b6fc8302 Mon Sep 17 00:00:00 2001 From: MazyGio Date: Mon, 2 Dec 2024 11:29:08 -0500 Subject: [PATCH 8/8] don't undo changes for btc markets --- hardhat.config.mainnet.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/hardhat.config.mainnet.ts b/hardhat.config.mainnet.ts index 5a9b7d9aa..5208eb58c 100644 --- a/hardhat.config.mainnet.ts +++ b/hardhat.config.mainnet.ts @@ -11,9 +11,11 @@ import { MAINNET_EZETH_182DAY, MAINNET_EZETH_COORDINATOR, MAINNET_FACTORY, + MAINNET_MORPHO_BLUE_CBBTC_USDC_182DAY, MAINNET_MORPHO_BLUE_COORDINATOR, MAINNET_MORPHO_BLUE_SUSDE_DAI_182DAY, MAINNET_MORPHO_BLUE_USDE_DAI_182DAY, + MAINNET_MORPHO_BLUE_WBTC_USDC_182DAY, MAINNET_MORPHO_BLUE_WSTETH_USDA_182DAY, MAINNET_RETH_182DAY, MAINNET_RETH_COORDINATOR, @@ -45,8 +47,8 @@ const config: HardhatUserConfig = { MAINNET_MORPHO_BLUE_SUSDE_DAI_182DAY, MAINNET_MORPHO_BLUE_USDE_DAI_182DAY, MAINNET_MORPHO_BLUE_WSTETH_USDA_182DAY, - // MAINNET_MORPHO_BLUE_WBTC_USDC_182DAY, - // MAINNET_MORPHO_BLUE_CBBTC_USDC_182DAY, + MAINNET_MORPHO_BLUE_WBTC_USDC_182DAY, + MAINNET_MORPHO_BLUE_CBBTC_USDC_182DAY, MAINNET_SCRVUSD_182DAY, MAINNET_STUSD_182DAY, MAINNET_SUSDE_182DAY,