forked from yearn/tokenized-strategy-foundry-mix
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #49 from term-finance/test-deploy-scripts
test deploy scripts
- Loading branch information
Showing
8 changed files
with
294 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
name: "[sepolia-deploy] deploy strategy" | ||
on: | ||
workflow_dispatch: | ||
inputs: | ||
asset: | ||
description: 'Asset address' | ||
required: true | ||
default: '0x' | ||
strategyName: | ||
description: 'Yearn strategy name' | ||
required: true | ||
default: '0x' | ||
discountRateMarkup: | ||
description: 'Discount rate markup' | ||
required: false | ||
default: '0.01' | ||
collateralTokenAddress: | ||
description: 'Collateral token address' | ||
required: false | ||
default: '0x' | ||
minCollateralRatio: | ||
description: 'Minimum collateral ratio' | ||
required: false | ||
default: '0.01' | ||
timeToMaturityThreshold: | ||
description: 'Time to maturity threshold' | ||
required: false | ||
default: '0' | ||
repoTokenConcentrationLimit: | ||
description: 'Repo token concentration limit' | ||
required: false | ||
default: '0.01' | ||
|
||
jobs: | ||
deploy: | ||
runs-on: ubuntu-latest | ||
environment: | ||
name: sepolia | ||
url: https://term-finance.github.io/yearn-v3-term-vault/ | ||
steps: | ||
- uses: actions/checkout@master | ||
with: | ||
fetch-depth: 0 | ||
submodules: recursive | ||
- uses: foundry-rs/foundry-toolchain@v1 | ||
- run: forge install | ||
- run: forge build | ||
- run: forge tree | ||
- run: forge script script/Strategy.s.sol:DeployStrategy --rpc-url $RPC_URL --broadcast --verify --verbosity 4 | ||
env: | ||
RPC_URL: ${{ secrets.RPC_URL }} | ||
PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} | ||
ETHERSCAN_API_KEY: ${{ secrets.ETHERSCAN_API_KEY }} | ||
ASSET_ADDRESS: ${{ github.event.inputs.asset }} | ||
YEARN_VAULT_ADDRESS: ${{ vars.YEARN_VAULT_ADDRESS }} | ||
IS_TEST: true | ||
STRATEGY_NAME: ${{ github.event.inputs.strategyName }} | ||
TERM_CONTROLLER_ADDRESS: ${{ vars.TERM_CONTROLLER_ADDRESS }} | ||
DISCOUNT_RATE_ADAPTER_ADDRESS: ${{ vars.DISCOUNT_RATE_ADAPTER_ADDRESS }} | ||
DISCOUNT_RATE_MARKUP: ${{ github.event.inputs.discountRateMarkup }} | ||
COLLATERAL_TOKEN_ADDR: ${{ github.event.inputs.COLLATERAL_TOKEN_ADDR }} | ||
MIN_COLLATERAL_RATIO: ${{ github.event.inputs.MIN_COLLATERAL_RATIO }} | ||
TIME_TO_MATURITY_THRESHOLD: ${{ github.event.inputs.timeToMaturityThreshold }} | ||
REPOTOKEN_CONCENTRATION_LIMIT: ${{ github.event.inputs.repoTokenConcentrationLimit }} | ||
ADMIN_ADDRESS: ${{ vars.ADMIN_ADDRESS }} | ||
DEVOPS_ADDRESS: ${{ vars.DEVOPS_ADDRESS }} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
name: "[sepolia-deploy] deploy vault" | ||
on: | ||
workflow_dispatch: | ||
inputs: | ||
asset: | ||
description: 'Asset address' | ||
required: true | ||
default: '0x' | ||
vaultName: | ||
description: 'Yearn vault name' | ||
required: true | ||
default: '0x' | ||
vaultSymbol: | ||
description: 'Yearn vault symbol' | ||
required: true | ||
default: '0x' | ||
profitMaxUnlockTime: | ||
description: 'Profit max unlock time' | ||
required: true | ||
default: '0' | ||
roleManager: | ||
description: 'Role Manager' | ||
required: false | ||
default: '0x' | ||
roleNumber: | ||
description: 'sum of roles' | ||
required: false | ||
default: '0' | ||
depositLimit: | ||
description: 'Deposit limit' | ||
required: false | ||
default: '0' | ||
|
||
|
||
jobs: | ||
deploy: | ||
runs-on: ubuntu-latest | ||
environment: | ||
name: sepolia | ||
url: https://term-finance.github.io/yearn-v3-term-vault/ | ||
steps: | ||
- uses: actions/checkout@master | ||
with: | ||
fetch-depth: 0 | ||
submodules: recursive | ||
- uses: foundry-rs/foundry-toolchain@v1 | ||
- run: forge install | ||
- run: forge build | ||
- run: forge tree | ||
- run: forge script script/VaultManagement.s.sol:SetupVaultManagement --rpc-url $RPC_URL --broadcast --verify --verbosity 4 | ||
env: | ||
RPC_URL: ${{ secrets.RPC_URL }} | ||
PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} | ||
ETHERSCAN_API_KEY: ${{ secrets.ETHERSCAN_API_KEY }} | ||
ASSET_ADDRESS: ${{ github.event.inputs.asset }} | ||
VAULT_FACTORY: ${{ vars.VAULT_FACTORY }} | ||
VAULT_NAME: ${{ github.event.inputs.vaultName }} | ||
VAULT_SYMBOL: ${{ github.event.inputs.vaultSymbol }} | ||
FEE_MANAGER: ${{ vars.FEE_MANAGER }} | ||
FEE_RECIPIENT: ${{ vars.FEE_RECIPIENT }} | ||
DEPOSIT_LIMIT: ${{ github.event.inputs.depositLimit }} | ||
IS_TEST: true | ||
ROLE_MANAGER: ${{ github.event.inputs.roleManager }} | ||
ROLE_NUM: ${{ github.event.inputs.roleNumber }} | ||
PROFIT_MAX_UNLOCK_TIME: ${{ github.event.inputs.profitMaxUnlockTime }} | ||
ADMIN_ADDRESS: ${{ vars.ADMIN_ADDRESS }} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Submodule vault-periphery
added at
2bf699
Submodule yearn-vaults-v3
added at
e5cf2a
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.18; | ||
|
||
import "forge-std/Script.sol"; | ||
import "../src/Strategy.sol"; | ||
import "../src/TermVaultEventEmitter.sol"; | ||
import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; | ||
|
||
contract DeployStrategy is Script { | ||
function run() external { | ||
uint256 deployerPK = vm.envUint("PRIVATE_KEY"); | ||
|
||
// Set up the RPC URL (optional if you're using the default foundry config) | ||
string memory rpcUrl = vm.envString("RPC_URL"); | ||
|
||
vm.startBroadcast(deployerPK); | ||
|
||
// Retrieve environment variables | ||
address asset = vm.envAddress("ASSET_ADDRESS"); | ||
string memory name = vm.envString("STRATEGY_NAME"); | ||
address yearnVaultAddress = vm.envAddress("YEARN_VAULT_ADDRESS"); | ||
address discountRateAdapterAddress = vm.envAddress("DISCOUNT_RATE_ADAPTER_ADDRESS"); | ||
address admin = vm.envAddress("ADMIN_ADDRESS"); | ||
address devops = vm.envAddress("DEVOPS_ADDRESS"); | ||
address termController = vm.envOr("TERM_CONTROLLER_ADDRESS", address(0)); | ||
uint256 discountRateMarkup = vm.envOr("DISCOUNT_RATE_MARKUP", uint256(0)); | ||
address collateralTokenAddr = vm.envOr("COLLATERAL_TOKEN_ADDR", address(0)); | ||
uint256 minCollateralRatio = vm.envOr("MIN_COLLATERAL_RATIO", uint256(0)); | ||
uint256 timeToMaturityThreshold = vm.envOr("TIME_TO_MATURITY_THRESHOLD", uint256(0)); | ||
uint256 repoTokenConcentrationLimit = vm.envOr("REPOTOKEN_CONCENTRATION_LIMIT", uint256(0)); | ||
bool isTest = vm.envBool("IS_TEST"); | ||
|
||
TermVaultEventEmitter eventEmitter = _deployEventEmitter(admin, devops); | ||
|
||
Strategy strategy = new Strategy(asset, | ||
name, | ||
yearnVaultAddress, | ||
discountRateAdapterAddress, | ||
address(eventEmitter) | ||
); | ||
|
||
console.log("deployed strateghy contract to"); | ||
console.log(address(strategy)); | ||
|
||
if (isTest) { | ||
eventEmitter.pairVaultContract(address(strategy)); | ||
console.log("paired strategy contract with event emitter"); | ||
|
||
strategy.setTermController(termController); | ||
console.log("set term controller"); | ||
console.log(termController); | ||
|
||
strategy.setDiscountRateMarkup(discountRateMarkup); | ||
console.log("set discount rate markup"); | ||
console.log(discountRateMarkup); | ||
|
||
strategy.setCollateralTokenParams(collateralTokenAddr, minCollateralRatio); | ||
console.log("set collateral token params"); | ||
console.log(collateralTokenAddr); | ||
console.log(minCollateralRatio); | ||
|
||
strategy.setTimeToMaturityThreshold(timeToMaturityThreshold); | ||
console.log("set time to maturity threshold"); | ||
console.log(timeToMaturityThreshold); | ||
|
||
strategy.setRepoTokenConcentrationLimit(repoTokenConcentrationLimit); | ||
console.log("set repo token concentration limit"); | ||
console.log(repoTokenConcentrationLimit); | ||
} | ||
|
||
vm.stopBroadcast(); | ||
} | ||
|
||
function _deployEventEmitter(address admin, address devops) internal returns(TermVaultEventEmitter eventEmitter) { | ||
TermVaultEventEmitter eventEmitterImpl = new TermVaultEventEmitter(); | ||
console.log("deployed event emitter impl contract to"); | ||
console.log(address(eventEmitterImpl)); | ||
ERC1967Proxy eventEmitterProxy = new ERC1967Proxy( | ||
address(eventEmitterImpl), | ||
abi.encodeWithSelector(TermVaultEventEmitter.initialize.selector, admin, devops) | ||
); | ||
TermVaultEventEmitter eventEmitter = TermVaultEventEmitter(address(eventEmitterProxy)); | ||
console.log("deployed event emitter proxy contract to"); | ||
console.log(address(eventEmitterProxy)); | ||
eventEmitter = TermVaultEventEmitter(address(eventEmitterProxy)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
// SPDX-License-Identifier: MIT | ||
pragma solidity ^0.8.18; | ||
|
||
import "forge-std/Script.sol"; | ||
import "@yearn-vaults/interfaces/IVault.sol"; | ||
import "@yearn-vaults/interfaces/IVaultFactory.sol"; | ||
import "vault-periphery/contracts/accountants/Accountant.sol"; | ||
import "vault-periphery/contracts/accountants/AccountantFactory.sol"; | ||
|
||
contract SetupVaultManagement is Script { | ||
function run() external { | ||
uint256 deployerPK = vm.envUint("PRIVATE_KEY"); | ||
|
||
// Set up the RPC URL (optional if you're using the default foundry config) | ||
string memory rpcUrl = vm.envString("RPC_URL"); | ||
|
||
vm.startBroadcast(deployerPK); | ||
|
||
// Retrieve environment variables | ||
address vaultFactoryAddress = vm.envAddress("VAULT_FACTORY"); | ||
address accountantFactoryAddress = vm.envAddress("ACCOUNTANT_FACTORY"); | ||
address asset = vm.envAddress("ASSET_ADDRESS"); | ||
string memory name = vm.envString("VAULT_NAME"); | ||
string memory symbol = vm.envString("VAULT_SYMBOL"); | ||
address roleManager = vm.envAddress("ROLE_MANAGER"); | ||
uint256 profitMaxUnlockTime = vm.envUint("PROFIT_MAX_UNLOCK_TIME"); | ||
address feeManager = vm.envAddress("FEE_MANAGER"); | ||
address feeRecipient = vm.envAddress("FEE_RECIPIENT"); | ||
uint256 depositLimit = vm.envOr("DEPOSIT_LIMIT",uint256(0)); | ||
|
||
address admin = vm.envAddress("ADMIN_ADDRESS"); | ||
uint256 roleNum = vm.envOr("ROLE_NUM", uint(256)); | ||
bool isTest = vm.envBool("IS_TEST"); | ||
|
||
IVaultFactory vaultFactory = IVaultFactory(vaultFactoryAddress); | ||
address vaultAddress = vaultFactory.deploy_new_vault(asset, name, symbol, roleManager, profitMaxUnlockTime); | ||
IVault vault = IVault(vaultAddress); | ||
console.log("deployed vault contract to"); | ||
console.log(address(vault)); | ||
|
||
AccountantFactory accountantFactory = AccountantFactory(accountantFactoryAddress); | ||
address accountantAddress = accountantFactory.newAccountant(feeManager, feeRecipient); | ||
Accountant accountant = Accountant(accountantAddress); | ||
console.log("deployed accountant contract to"); | ||
console.log(address(accountant)); | ||
|
||
if (isTest) { | ||
vault.set_accountant(address(accountant)); | ||
console.log("set accountant for vault"); | ||
console.log(address(accountant)); | ||
|
||
vault.set_role(admin, roleNum); | ||
console.log("set role for admin"); | ||
console.log(roleNum); | ||
|
||
vault.set_deposit_limit(depositLimit); | ||
console.log("set deposit limit"); | ||
console.log(depositLimit); | ||
} | ||
|
||
vm.stopBroadcast(); | ||
} | ||
} |