Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test deploy scripts #49

Merged
merged 1 commit into from
Sep 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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();
}
}
Loading