Skip to content

Commit

Permalink
Merge pull request #49 from term-finance/test-deploy-scripts
Browse files Browse the repository at this point in the history
test deploy scripts
  • Loading branch information
aazhou1 authored Sep 26, 2024
2 parents ac74a9d + 55c411d commit d625e90
Show file tree
Hide file tree
Showing 8 changed files with 294 additions and 0 deletions.
67 changes: 67 additions & 0 deletions .github/workflows/deploy-sepolia-strategy.yaml
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 }}

67 changes: 67 additions & 0 deletions .github/workflows/deploy-sepolia-vault.yaml
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 }}

6 changes: 6 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,9 @@
[submodule "lib/openzeppelin-contracts-upgradeable"]
path = lib/openzeppelin-contracts-upgradeable
url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable
[submodule "lib/yearn-vaults-v3"]
path = lib/yearn-vaults-v3
url = https://github.com/yearn/yearn-vaults-v3.git
[submodule "lib/vault-periphery"]
path = lib/vault-periphery
url = https://github.com/yearn/vault-periphery.git
2 changes: 2 additions & 0 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ remappings = [
"forge-std/=lib/forge-std/src/",
"@tokenized-strategy/=lib/tokenized-strategy/src/",
"@periphery/=lib/tokenized-strategy-periphery/src/",
"@yearn-vaults/=lib/yearn-vaults-v3/contracts",
"vault-periphery/=lib/vault-periphery/"
]

# See more config options https://github.com/foundry-rs/foundry/tree/master/config
1 change: 1 addition & 0 deletions lib/vault-periphery
Submodule vault-periphery added at 2bf699
1 change: 1 addition & 0 deletions lib/yearn-vaults-v3
Submodule yearn-vaults-v3 added at e5cf2a
87 changes: 87 additions & 0 deletions script/Strategy.s.sol
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));
}
}
63 changes: 63 additions & 0 deletions script/VaultManagement.s.sol
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();
}
}

0 comments on commit d625e90

Please sign in to comment.