Skip to content
Open
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
4 changes: 4 additions & 0 deletions .github/workflows/manual.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,11 @@ jobs:
yarn test-fast:mainnet
yarn test-fast:vaultv2-upgrade-test:mainnet
yarn test-fast:vaultv2-strategy:mainnet
- name: Test Polygon
run: |
yarn test-fast:vaultv2-strategy:polygon
- name: Test Avalanche
run: |
yarn test-fast:vaultv2-strategy:avalanche
- name: Send GitHub Action trigger data to Slack workflow
id: slack
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,6 @@
[submodule "contracts/protocol/adapters/ethereum/sushiswap-pool-adapter-ethereum"]
path = contracts/protocol/adapters/ethereum/sushiswap-pool-adapter-ethereum
url = git@github.com:Opty-Fi/sushiswap-pool-adapter-ethereum.git
[submodule "contracts/protocol/adapters/avalanche/traderjoe-and-benqi-adapters"]
path = contracts/protocol/adapters/avalanche/traderjoe-and-benqi-adapters
url = git@github.com:Opty-Fi/traderjoe-and-benqi-adapters.git
63 changes: 63 additions & 0 deletions deploy_avalanche/003_deploy_benqiadapter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { BigNumber } from "ethers";
import { DeployFunction } from "hardhat-deploy/dist/types";
import { HardhatRuntimeEnvironment } from "hardhat/types";
import { ESSENTIAL_CONTRACTS } from "../helpers/constants/essential-contracts-name";
import { waitforme } from "../helpers/utils";
import { Registry } from "../typechain";

const CONTRACTS_VERIFY = process.env.CONTRACTS_VERIFY;

const func: DeployFunction = async ({
deployments,
getChainId,
ethers,
network,
tenderly,
run,
}: HardhatRuntimeEnvironment) => {
const { deploy } = deployments;
const artifact = await deployments.getArtifact("BenqiAdapter");
const registryProxyAddress = await (await deployments.get("RegistryProxy")).address;
const registryV2Instance = <Registry>await ethers.getContractAt(ESSENTIAL_CONTRACTS.REGISTRY, registryProxyAddress);
const operatorAddress = await registryV2Instance.getOperator();
const chainId = await getChainId();
const networkName = network.name;
const feeData = await ethers.provider.getFeeData();
const result = await deploy("BenqiAdapter", {
from: operatorAddress,
contract: {
abi: artifact.abi,
bytecode: artifact.bytecode,
deployedBytecode: artifact.deployedBytecode,
},
args: [registryProxyAddress],
log: true,
skipIfAlreadyDeployed: true,
maxPriorityFeePerGas: BigNumber.from(feeData["maxPriorityFeePerGas"]), // Recommended maxPriorityFeePerGas
maxFeePerGas: BigNumber.from(feeData["maxFeePerGas"]),
});

if (CONTRACTS_VERIFY == "true") {
if (result.newlyDeployed) {
const aaveAdapter = await deployments.get("BenqiAdapter");
if (networkName === "tenderly") {
await tenderly.verify({
name: "BenqiAdapter",
address: aaveAdapter.address,
constructorArguments: [registryProxyAddress],
});
} else if (!["31337"].includes(chainId)) {
await waitforme(20000);

await run("verify:verify", {
name: "BenqiAdapter",
address: aaveAdapter.address,
constructorArguments: [registryProxyAddress],
});
}
}
}
};
export default func;
func.tags = ["AvalancheBenqiAdapter"];
func.dependencies = ["Registry"];
63 changes: 63 additions & 0 deletions deploy_avalanche/004_deploy_traderjoelendadapter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { BigNumber } from "ethers";
import { DeployFunction } from "hardhat-deploy/dist/types";
import { HardhatRuntimeEnvironment } from "hardhat/types";
import { ESSENTIAL_CONTRACTS } from "../helpers/constants/essential-contracts-name";
import { waitforme } from "../helpers/utils";
import { Registry } from "../typechain";

const CONTRACTS_VERIFY = process.env.CONTRACTS_VERIFY;

const func: DeployFunction = async ({
deployments,
getChainId,
ethers,
network,
tenderly,
run,
}: HardhatRuntimeEnvironment) => {
const { deploy } = deployments;
const artifact = await deployments.getArtifact("TraderJoeLendAdapter");
const registryProxyAddress = await (await deployments.get("RegistryProxy")).address;
const registryV2Instance = <Registry>await ethers.getContractAt(ESSENTIAL_CONTRACTS.REGISTRY, registryProxyAddress);
const operatorAddress = await registryV2Instance.getOperator();
const chainId = await getChainId();
const networkName = network.name;
const feeData = await ethers.provider.getFeeData();
const result = await deploy("TraderJoeLendAdapter", {
from: operatorAddress,
contract: {
abi: artifact.abi,
bytecode: artifact.bytecode,
deployedBytecode: artifact.deployedBytecode,
},
args: [registryProxyAddress],
log: true,
skipIfAlreadyDeployed: true,
maxPriorityFeePerGas: BigNumber.from(feeData["maxPriorityFeePerGas"]), // Recommended maxPriorityFeePerGas
maxFeePerGas: BigNumber.from(feeData["maxFeePerGas"]),
});

if (CONTRACTS_VERIFY == "true") {
if (result.newlyDeployed) {
const aaveAdapter = await deployments.get("TraderJoeLendAdapter");
if (networkName === "tenderly") {
await tenderly.verify({
name: "TraderJoeLendAdapter",
address: aaveAdapter.address,
constructorArguments: [registryProxyAddress],
});
} else if (!["31337"].includes(chainId)) {
await waitforme(20000);

await run("verify:verify", {
name: "TraderJoeLendAdapter",
address: aaveAdapter.address,
constructorArguments: [registryProxyAddress],
});
}
}
}
};
export default func;
func.tags = ["AvalancheTraderJoeLendAdapter"];
func.dependencies = ["Registry"];
63 changes: 63 additions & 0 deletions deploy_avalanche/005_deploy_traderjoestakeadapter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { BigNumber } from "ethers";
import { DeployFunction } from "hardhat-deploy/dist/types";
import { HardhatRuntimeEnvironment } from "hardhat/types";
import { ESSENTIAL_CONTRACTS } from "../helpers/constants/essential-contracts-name";
import { waitforme } from "../helpers/utils";
import { Registry } from "../typechain";

const CONTRACTS_VERIFY = process.env.CONTRACTS_VERIFY;

const func: DeployFunction = async ({
deployments,
getChainId,
ethers,
network,
tenderly,
run,
}: HardhatRuntimeEnvironment) => {
const { deploy } = deployments;
const artifact = await deployments.getArtifact("TraderJoeStakeAdapter");
const registryProxyAddress = await (await deployments.get("RegistryProxy")).address;
const registryV2Instance = <Registry>await ethers.getContractAt(ESSENTIAL_CONTRACTS.REGISTRY, registryProxyAddress);
const operatorAddress = await registryV2Instance.getOperator();
const chainId = await getChainId();
const networkName = network.name;
const feeData = await ethers.provider.getFeeData();
const result = await deploy("TraderJoeStakeAdapter", {
from: operatorAddress,
contract: {
abi: artifact.abi,
bytecode: artifact.bytecode,
deployedBytecode: artifact.deployedBytecode,
},
args: [registryProxyAddress],
log: true,
skipIfAlreadyDeployed: true,
maxPriorityFeePerGas: BigNumber.from(feeData["maxPriorityFeePerGas"]), // Recommended maxPriorityFeePerGas
maxFeePerGas: BigNumber.from(feeData["maxFeePerGas"]),
});

if (CONTRACTS_VERIFY == "true") {
if (result.newlyDeployed) {
const aaveAdapter = await deployments.get("TraderJoeStakeAdapter");
if (networkName === "tenderly") {
await tenderly.verify({
name: "TraderJoeStakeAdapter",
address: aaveAdapter.address,
constructorArguments: [registryProxyAddress],
});
} else if (!["31337"].includes(chainId)) {
await waitforme(20000);

await run("verify:verify", {
name: "TraderJoeStakeAdapter",
address: aaveAdapter.address,
constructorArguments: [registryProxyAddress],
});
}
}
}
};
export default func;
func.tags = ["AvalancheTraderJoeStakeAdapter"];
func.dependencies = ["Registry"];
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ const func: DeployFunction = async ({ deployments, ethers }: HardhatRuntimeEnvir
const registryV2Instance = await ethers.getContractAt(ESSENTIAL_CONTRACTS.REGISTRY, registryProxyAddress);
const aaveV2Adapter = await deployments.get("AaveV2AvalancheAdapter");
const aaveV3Adapter = await deployments.get("AaveV3AvalancheAdapter");
const benqiAdapter = await deployments.get("BenqiAdapter");
const traderJoeLendAdapter = await deployments.get("TraderJoeLendAdapter");
const traderJoeStakeAdapter = await deployments.get("TraderJoeStakeAdapter");

const operatorAddress = await registryV2Instance.getOperator();
const operatorSigner = await ethers.getSigner(operatorAddress);
Expand All @@ -19,6 +22,24 @@ const func: DeployFunction = async ({ deployments, ethers }: HardhatRuntimeEnvir
const poolsWithRatings: { [key: string]: { rate: number; adapter: string } } = {
"0x4235E22d9C3f28DCDA82b58276cb6370B01265C2": { rate: 90, adapter: aaveV2Adapter.address }, // aave lendingpoolregistryprovider
"0x770ef9f4fe897e59daCc474EF11238303F9552b6": { rate: 90, adapter: aaveV3Adapter.address }, // aave lendingpoolregistryprovider
"0x5C0401e81Bc07Ca70fAD469b451682c0d747Ef1c": { rate: 90, adapter: benqiAdapter.address }, // benqi adapter
"0xBEb5d47A3f720Ec0a390d04b4d41ED7d9688bC7F": { rate: 90, adapter: benqiAdapter.address }, // benqi adapter
"0x4e9f683A27a6BdAD3FC2764003759277e93696e6": { rate: 90, adapter: benqiAdapter.address }, // benqi adapter
"0x835866d37AFB8CB8F8334dCCdaf66cf01832Ff5D": { rate: 90, adapter: benqiAdapter.address }, // benqi adapter
"0xe194c4c5aC32a3C9ffDb358d9Bfd523a0B6d1568": { rate: 90, adapter: benqiAdapter.address }, // benqi adapter
"0x334AD834Cd4481BB02d09615E7c11a00579A7909": { rate: 90, adapter: benqiAdapter.address }, // benqi adapter
"0xc9e5999b8e75C3fEB117F6f73E664b9f3C8ca65C": { rate: 90, adapter: benqiAdapter.address }, // benqi adapter
"0x29472D511808Ce925F501D25F9Ee9efFd2328db2": { rate: 90, adapter: traderJoeLendAdapter.address }, // traderJoeLend adapter
"0xC22F01ddc8010Ee05574028528614634684EC29e": { rate: 90, adapter: traderJoeLendAdapter.address }, // traderJoeLend adapter
"0xEd6AaF91a2B084bd594DBd1245be3691F9f637aC": { rate: 90, adapter: traderJoeLendAdapter.address }, // traderJoeLend adapter
"0x585E7bC75089eD111b656faA7aeb1104F5b96c15": { rate: 90, adapter: traderJoeLendAdapter.address }, // traderJoeLend adapter
"0xc988c170d0E38197DC634A45bF00169C7Aa7CA19": { rate: 90, adapter: traderJoeLendAdapter.address }, // traderJoeLend adapter
"0x3fE38b7b610C0ACD10296fEf69d9b18eB7a9eB1F": { rate: 90, adapter: traderJoeLendAdapter.address }, // traderJoeLend adapter
"0x929f5caB61DFEc79a5431a7734a68D714C4633fa": { rate: 90, adapter: traderJoeLendAdapter.address }, // traderJoeLend adapter
"0x8b650e26404AC6837539ca96812f0123601E4448": { rate: 90, adapter: traderJoeLendAdapter.address }, // traderJoeLend adapter
"0xcE095A9657A02025081E0607c8D8b081c76A75ea": { rate: 90, adapter: traderJoeLendAdapter.address }, // traderJoeLend adapter
"0xC146783a59807154F92084f9243eb139D58Da696": { rate: 90, adapter: traderJoeLendAdapter.address }, // traderJoeLend adapter
"0x57319d41F71E81F3c65F2a47CA4e001EbAFd4F33": { rate: 90, adapter: traderJoeStakeAdapter.address }, // traderJoeStake adapter
};

const onlyMapPoolsToAdapters = [];
Expand Down Expand Up @@ -95,4 +116,4 @@ const func: DeployFunction = async ({ deployments, ethers }: HardhatRuntimeEnvir
};
export default func;
func.tags = ["AvalancheApproveAndMapLiquidityPoolToAdapter"];
func.dependencies = ["AvalancheAaveV2Adapter", "AvalancheAaveV3Adapter"];
func.dependencies = ["AvalancheAaveV2Adapter", "AvalancheAaveV3Adapter", "AvalancheBenqiAdapter"];
80 changes: 80 additions & 0 deletions deploy_avalanche/010_deploy_opUSDTgrow.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { BigNumber } from "ethers";
import { DeployFunction } from "hardhat-deploy/dist/types";
import { HardhatRuntimeEnvironment } from "hardhat/types";
import { MULTI_CHAIN_VAULT_TOKENS } from "../helpers/constants/tokens";
import { waitforme } from "../helpers/utils";

const CONTRACTS_VERIFY = process.env.CONTRACTS_VERIFY;

const func: DeployFunction = async ({
deployments,
getNamedAccounts,
getChainId,
network,
tenderly,
run,
ethers,
}: HardhatRuntimeEnvironment) => {
const { deploy } = deployments;
const { deployer, admin } = await getNamedAccounts();
const artifact = await deployments.getArtifact("Vault");
const artifactVaultProxyV2 = await deployments.getArtifact("AdminUpgradeabilityProxy");
const registryProxyAddress = await (await deployments.get("RegistryProxy")).address;

const chainId = await getChainId();
const networkName = network.name;
const feeData = await ethers.provider.getFeeData();

const result = await deploy("opUSDTgrow", {
from: deployer,
contract: {
abi: artifact.abi,
bytecode: artifact.bytecode,
deployedBytecode: artifact.deployedBytecode,
},
args: [registryProxyAddress, "Tether USD", "USDT.e", "Growth", "grow"],
log: true,
skipIfAlreadyDeployed: true,
proxy: {
owner: admin,
upgradeIndex: 0,
proxyContract: {
abi: artifactVaultProxyV2.abi,
bytecode: artifactVaultProxyV2.bytecode,
deployedBytecode: artifactVaultProxyV2.deployedBytecode,
},
execute: {
init: {
methodName: "initialize",
args: [registryProxyAddress, MULTI_CHAIN_VAULT_TOKENS[chainId].USDT.hash, "Tether USD", "USDT.e", "1"],
},
},
},
maxPriorityFeePerGas: BigNumber.from(feeData["maxPriorityFeePerGas"]), // Recommended maxPriorityFeePerGas
maxFeePerGas: BigNumber.from(feeData["maxFeePerGas"]),
});

if (CONTRACTS_VERIFY == "true") {
if (result.newlyDeployed) {
const vault = await deployments.get("opUSDTgrow");
if (networkName === "tenderly") {
await tenderly.verify({
name: "opUSDTgrow",
address: vault.address,
constructorArguments: [registryProxyAddress, "Tether USD", "USDT.e", "Growth", "grow"],
});
} else if (!["31337"].includes(chainId)) {
await waitforme(20000);

await run("verify:verify", {
name: "opUSDTgrow",
address: vault.address,
constructorArguments: [registryProxyAddress, "Tether USD", "USDT.e", "Growth", "grow"],
});
}
}
}
};
export default func;
func.tags = ["AvalancheopUSDTgrow"];
func.dependencies = ["AvalancheApproveTokensAndMapTokensHash"];
Loading