Skip to content

Commit

Permalink
Merge pull request #218 from tradingstrategy-ai/guard-aave-1delta
Browse files Browse the repository at this point in the history
More Aave and 1delta deployment addresses
  • Loading branch information
hieuh25 authored Jul 23, 2024
2 parents 622ef0d + 423d93b commit d7ef9bd
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 24 deletions.
9 changes: 9 additions & 0 deletions eth_defi/aave_v3/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,8 +234,17 @@ class AaveVersion(enum.Enum):
AAVE_V3_DEPLOYMENTS = {
"ethereum": {
"pool": "0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2",
"data_provider": "0x7B4EB56E7CD4b454BA8ff71E4518426369a138a3",
"oracle": "0x54586bE62E3c3580375aE3723C145253060Ca0C2",
},
"arbitrum": {
"pool": "0x794a61358D6845594F94dc1DB02A252b5b4814aD",
"data_provider": "0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654",
"oracle": "0xb56c2F0B653B2e0b10C9b928C8580Ac5Df02C7C7",
},
"polygon": {
"pool": "0x794a61358D6845594F94dc1DB02A252b5b4814aD",
"data_provider": "0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654",
"oracle": "0xb023e699F5a33916Ea823A16485e259257cA8Bd1",
},
}
56 changes: 33 additions & 23 deletions eth_defi/enzyme/generic_adapter_vault.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,34 +13,48 @@
guard = get_deployed_contract(web3, "guard/GuardV0", guard_address)
"""

import logging
import os
from pathlib import Path
from typing import Collection

from eth_typing import HexAddress
from web3 import Web3
from web3.contract import Contract

from eth_defi.aave_v3.constants import AAVE_V3_DEPLOYMENTS
from eth_defi.aave_v3.deployment import fetch_deployment as fetch_aave_deployment
from eth_defi.enzyme.deployment import EnzymeDeployment
from eth_defi.enzyme.policy import create_safe_default_policy_configuration_for_generic_adapter
from eth_defi.enzyme.policy import (
create_safe_default_policy_configuration_for_generic_adapter,
)
from eth_defi.enzyme.vault import Vault
from eth_defi.foundry.forge import deploy_contract_with_forge
from eth_defi.hotwallet import HotWallet
from eth_defi.one_delta.constants import ONE_DELTA_DEPLOYMENTS
from eth_defi.one_delta.deployment import fetch_deployment as fetch_1delta_deployment
from eth_defi.token import TokenDetails, fetch_erc20_details
from eth_defi.trace import assert_transaction_success_with_explanation
from eth_defi.uniswap_v2.constants import UNISWAP_V2_DEPLOYMENTS, QUICKSWAP_DEPLOYMENTS
from eth_defi.uniswap_v2.constants import QUICKSWAP_DEPLOYMENTS, UNISWAP_V2_DEPLOYMENTS
from eth_defi.uniswap_v2.utils import ZERO_ADDRESS
from eth_defi.uniswap_v3.constants import UNISWAP_V3_DEPLOYMENTS
from eth_defi.aave_v3.deployment import fetch_deployment as fetch_aave_deployment
from eth_defi.one_delta.deployment import fetch_deployment as fetch_1delta_deployment


logger = logging.getLogger(__name__)


CONTRACTS_ROOT = Path(os.path.dirname(__file__)) / ".." / ".." / "contracts"


def _get_chain_slug(web3: Web3) -> str:
return {
31337: "anvil", # only for testing
1: "ethereum",
137: "polygon",
42161: "arbitrum",
}[web3.eth.chain_id]


def deploy_vault_with_generic_adapter(
deployment: EnzymeDeployment,
deployer: HotWallet,
Expand Down Expand Up @@ -151,6 +165,7 @@ def deploy_vault_with_generic_adapter(
# Nothing bad can be done with this key, but good diagnostics is more important
web3 = deployment.web3
deployed_at_block = web3.eth.block_number
chain_slug = _get_chain_slug(web3)
logger.info(
"Deploying Enzyme vault. Enzyme fund deployer: %s, Terms of service: %s, USDC: %s, Etherscan API key: %s, block %d",
deployment.contracts.fund_deployer.address,
Expand Down Expand Up @@ -338,34 +353,28 @@ def deploy_vault_with_generic_adapter(
assert_transaction_success_with_explanation(web3, tx_hash)

if one_delta or aave:

# TODO: Move to a separate function
assert chain_slug in AAVE_V3_DEPLOYMENTS, f"Chain {chain_slug} not supported for Aave v3"

aave_v3_deployment = fetch_aave_deployment(
web3,
pool_address="0x794a61358D6845594F94dc1DB02A252b5b4814aD",
data_provider_address="0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654",
oracle_address="0xb023e699F5a33916Ea823A16485e259257cA8Bd1",
pool_address=AAVE_V3_DEPLOYMENTS[chain_slug]["pool"],
data_provider_address=AAVE_V3_DEPLOYMENTS[chain_slug]["data_provider"],
oracle_address=AAVE_V3_DEPLOYMENTS[chain_slug]["oracle"],
)
aave_pool_address = aave_v3_deployment.pool.address
else:
aave_pool_address = None

if one_delta:
assert chain_slug in ONE_DELTA_DEPLOYMENTS, f"Chain {chain_slug} not supported for 1delta"

one_delta_deployment = fetch_1delta_deployment(
web3,
flash_aggregator_address="0x74E95F3Ec71372756a01eB9317864e3fdde1AC53",
broker_proxy_address="0x74E95F3Ec71372756a01eB9317864e3fdde1AC53",
quoter_address="0x36de3876ad1ef477e8f6d98EE9a162926f00463A",
flash_aggregator_address=ONE_DELTA_DEPLOYMENTS[chain_slug]["broker_proxy"],
broker_proxy_address=ONE_DELTA_DEPLOYMENTS[chain_slug]["broker_proxy"],
quoter_address=ONE_DELTA_DEPLOYMENTS[chain_slug]["quoter"],
)

match web3.eth.chain_id:
case 137:
pass
case _:
raise NotImplementedError("1delta/Aave lacks data for chain %d", web3.eth.chain_id)

broker_proxy_address = one_delta_deployment.broker_proxy.address

logger.info("Whitelisting 1delta: %s and Aave: %s", broker_proxy_address, aave_pool_address)
Expand All @@ -376,14 +385,15 @@ def deploy_vault_with_generic_adapter(

if aave:

note = f"Allow Aave v3 pool"
tx_hash = guard.functions.whitelistAaveV3(aave_pool_address, note).transact({"from": deployer.address})
assert_transaction_success_with_explanation(web3, tx_hash)

assert web3.eth.chain_id == 1, "TODO: Add support for non-mainnet chains"
ausdc_address = "0x98C23E9d8f34FEFb1B7BD6a91B7FF122F4e16F5c"
logger.info("Aave whitelisting for pool %s, aUSDC %s", aave_pool_address, ausdc_address)
note = f"Aave v3 pool whitelisting for USDC"

tx_hash = guard.functions.whitelistAaveV3(aave_pool_address, note).transact({"from": deployer.address})
assert_transaction_success_with_explanation(web3, tx_hash)

note = f"Aave v3 pool whitelisting for USDC"
tx_hash = guard.functions.whitelistToken(ausdc_address, note).transact({"from": deployer.address})
assert_transaction_success_with_explanation(web3, tx_hash)

Expand Down
9 changes: 9 additions & 0 deletions eth_defi/one_delta/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,12 @@ class TradeOperation(str, Enum):
class TradeType(IntEnum):
EXACT_INPUT = 0
EXACT_OUTPUT = 1


# https://docs.1delta.io/contract-addresses/aave-v3.html
ONE_DELTA_DEPLOYMENTS = {
"polygon": {
"broker_proxy": "0x74E95F3Ec71372756a01eB9317864e3fdde1AC53",
"quoter": "0x36de3876ad1ef477e8f6d98EE9a162926f00463A",
},
}
2 changes: 1 addition & 1 deletion tests/guard/test_guard_simple_vault_aave_v3.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def anvil_polygon_chain_fork(request, large_usdc_holder) -> str:
launch = fork_network_anvil(
mainnet_rpc,
unlocked_addresses=[large_usdc_holder],
fork_block_number=51_000_000,
fork_block_number=58_000_000,
)
try:
yield launch.json_rpc_url
Expand Down
6 changes: 6 additions & 0 deletions tests/guard/test_guard_simple_vault_one_delta.py
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,8 @@ def test_guard_can_short(
tx_hash = vault.functions.performCall(target, call_data).transact({"from": asset_manager})
assert_transaction_success_with_explanation(web3, tx_hash, tracing=True)

mine(web3)

# we should have some vWETH in the vault
assert vweth.functions.balanceOf(vault.address).call() == pytest.approx(weth_amount_to_short)
assert ausdc.functions.balanceOf(vault.address).call() == pytest.approx(12233287803)
Expand All @@ -346,6 +348,8 @@ def test_guard_can_short(
tx_hash = vault.functions.performCall(target, call_data).transact({"from": asset_manager})
assert_transaction_success_with_explanation(web3, tx_hash, tracing=True)

mine(web3)

# check new position size
assert vweth.functions.balanceOf(vault.address).call() == pytest.approx(weth_amount_to_short * 2)
assert ausdc.functions.balanceOf(vault.address).call() == pytest.approx(24462991693)
Expand All @@ -369,6 +373,8 @@ def test_guard_can_short(
tx_hash = vault.functions.performCall(target, call_data).transact({"from": asset_manager})
assert_transaction_success_with_explanation(web3, tx_hash, tracing=True)

mine(web3)

# check new position size
assert vweth.functions.balanceOf(vault.address).call() == pytest.approx(weth_amount_to_short)
assert ausdc.functions.balanceOf(vault.address).call() == pytest.approx(22219843923)
Expand Down

0 comments on commit d7ef9bd

Please sign in to comment.