Aave LendingPool contract is the main contract of the protocol. It exposes all the user-oriented actions that can be invoked using either Solidity or web3 libraries.
from code import interactfrom distutils.command.config import configfrom scripts.helpful_scripts import get_accountfrom brownie import network, config, interfacefrom scripts.get_weth import get_wethdefmain(): account =get_account() deposit_token = config["networks"][network.show_active()]["weth_token"]# if no WETH, get_weth()# local mainnet fork can use dummy acocunts to get WETH# since local mainnet fork, can use dummy accounts. if actual mainnet/testnet then use private key account.if network.show_active()in ["mainnet-fork"]:get_weth()# Get lending pool contract lending_pool_address =get_lendingpool() lending_pool = interface.ILendingPool(lending_pool_address)print(f"....Lending pool contract: {lending_pool_address}....")# Approve sending our ERC20(WETH) tokensapprove_erc20(deposit_amount, lending_pool.address, deposit_token, account)defget_lendingpool():# create lending_pool_addressess_provider contract object lending_pool_addressess_provider = interface.ILendingPoolAddressesProvider(config["networks"][network.show_active()]["lending_pool_addressess_provider"])#get lending pool address lending_pool = lending_pool_addressess_provider.getLendingPool()return lending_pool
from brownie import network,accounts,configLOCAL_BLOCKCHAIN_ENV = ["development","ganache-local"]FORKED_LOCAL_ENV = ["mainnet-fork","mainnet-fork-dev"]defget_account(index=None,id=None):# accounts[0] -- ganache accounts# accounts.add("env") -- private key from env file -> accounts.add(config["wallets"]["wallet1"])# accounts.load("id") -- load from brownie accounts list if index:# if index was passed return ganache accountreturn accounts[index]ifid:return accounts.load(id)if network.show_active()in LOCAL_BLOCKCHAIN_ENV or network.show_active()in FORKED_LOCAL_ENV:return accounts[0]#use ganache generated account. else:#look in config.yamlreturn accounts.add(config["wallets"]["wallet1"])
dependencies: - aave/protocol-v2@1.0.1compiler:solc:remappings: - '@aave=aave/protocol-v2@1.0.1'dotenv:.envnetworks:default:developmentrinkeby:weth_token:'0xc778417E063141139Fce010982780140Aa0cD5Ab'#WEthGateway contractlending_pool_addressess_provider:'0x88757f2f99175387ab4c6a4b3067c77a695b0349'verify:Truekovan:weth_token:'0xd0A1E359811322d97991E03f863a0C30C2cF029C'#WEthGateway contractlending_pool_addressess_provider:'0x88757f2f99175387ab4c6a4b3067c77a695b0349'verify:Truemainnet-fork:#development env, fork uses live mainnet addresses weth_token:'0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'#WEthGateway contractlending_pool_addressess_provider:'0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5'mainnet:# for productionweth_token:'0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'#WEthGateway contractwallets:wallet1:${PRIVATE_KEY
Approve
Before we can deposit we must approve Aave's contract to use our WETH tokens. This is done with the approve function.
Because DApps (decentralized applications) use smart contracts to execute transactions, you must give permission for the smart contract to transfer up to a certain amount of your token (allowance).
To reiterate, transacting with ERC-20 tokens is a 2-step process:
In a generic implementation, we would create IERC20.sol in our interfaces folder, and pass the ERC20 token contract into the interface as above.
Subsequently, we call on the token contract to approve setting our allowance for another 3rd party contract (via erc20.approve).
from scripts.helpful_scripts import get_accountfrom brownie import network, config, interfacefrom scripts.get_weth import get_wethfrom web3 import Web3#0.1 ETH - 0.1*(10**18)deposit_amount = Web3.toWei(0.1, "ether")defget_lendingpool():# create lending_pool_addressess_provider contract object lending_pool_addressess_provider = interface.ILendingPoolAddressesProvider(config["networks"][network.show_active()]["lending_pool_addressess_provider"])#get lending pool address lending_pool = lending_pool_addressess_provider.getLendingPool()return lending_pooldefapprove_erc20(amount,spender,erc20_address,account):print("....Approving ERC20 token...")# get ERC20 interface: https://github.com/PatrickAlphaC/aave_brownie_py_freecode/tree/main/interfaces# approve(address spender, uint256 value) erc20 = interface.IERC20(erc20_address) tx = erc20.approve(spender,amount,{"from": account}) tx.wait(1)print("....Approved....")return txdefmain(): account =get_account() deposit_token = config["networks"][network.show_active()]["weth_token"]# if no WETH, get_weth()# local mainnet fork can use dummy acocunts to get WETH# since local mainnet fork, can use dummy accounts. if actual mainnet/testnet then use private key account.if network.show_active()in ["mainnet-fork"]:get_weth()# Get lending pool contract lending_pool_address =get_lendingpool() lending_pool = interface.ILendingPool(lending_pool_address)print(f"....Lending pool contract: {lending_pool_address}....")# Approve sending our ERC20(WETH) tokensapprove_erc20(deposit_amount, lending_pool.address, deposit_token, account)
since we are always runnning on mainnet-fork, set default = mainnet-fork in brownie-config.yaml, under the networks section.
Deposit
When depositing, the LendingPool contract must haveallowance()to spend funds on behalf ofmsg.sender for at-leastamount for the asset being deposited. This can be done via the standard ERC20 approve() method.
The referral program is currently inactive and you can pass0 as thereferralCode.
In future for referral code to be active again, a governance proposal, with the list of unique referral codes for various integration must be passed via governance.
We will the below to main():
## Deposit: deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)# referralCode is deprecated - pass a 0 as parameterprint("....Depositing....")tx = lending_pool.deposit(deposit_token_address, deposit_amount, account.address,0, {"from": account})tx.wait(1)# wait one blockprint("....Deposited!....")
from scripts.helpful_scripts import get_accountfrom brownie import network, config, interfacefrom scripts.get_weth import get_wethfrom web3 import Web3#0.1 ETH - 0.1*(10**18)deposit_amount = Web3.toWei(0.1, "ether")defget_lendingpool():# create lending_pool_addressess_provider contract object lending_pool_addressess_provider = interface.ILendingPoolAddressesProvider(config["networks"][network.show_active()]["lending_pool_addressess_provider"])#get lending pool address lending_pool = lending_pool_addressess_provider.getLendingPool()return lending_pooldefapprove_erc20(amount,spender,erc20_address,account):print("....Approving ERC20 token...")# get ERC20 interface: https://github.com/PatrickAlphaC/aave_brownie_py_freecode/tree/main/interfaces# approve(address spender, uint256 value) erc20 = interface.IERC20(erc20_address) tx = erc20.approve(spender,amount,{"from": account}) tx.wait(1)print("....Approved....")return txdefmain(): account =get_account() deposit_token_address = config["networks"][network.show_active()]["weth_token"]# if no WETH, get_weth()# local mainnet fork can use dummy acocunts to get WETH# since local mainnet fork, can use dummy accounts. if actual mainnet/testnet then use private key account.if network.show_active()in ["mainnet-fork"]:get_weth()# Get lending pool contract lending_pool_address =get_lendingpool() lending_pool = interface.ILendingPool(lending_pool_address)print(f"....Lending pool contract: {lending_pool_address}....")# Approve sending our ERC20(WETH) tokensapprove_erc20(deposit_amount, lending_pool.address, deposit_token_address, account)## Deposit: deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)# referralCode is deprecated - just pass a 0 as parameterprint("....Depositing....") tx = lending_pool.deposit(deposit_token_address, deposit_amount, account.address,0, {"from": account}) tx.wait(1)# wait one blockprint("....Deposited!....")