def test_live_dai(accounts):

    me = accounts.at("0x7495B77b15fCb52fbb7BCB7380335d819ce4c04B", force=True)
    ygov = accounts.at("0xFEB4acf3df3cDEA7399794D0869ef76A6EfAff52", force=True)
    usdc_vault = Contract("0x5f18C75AbDAe578b483E5F43f12a39cF75b973a9", owner=ygov)
    sharerV4 = Contract("0xc491599b9a20c3a2f0a85697ee6d9434efa9f503")
    idleusdc = Contract("0x2E1ad896D3082C52A5AE7Af307131DE7a37a46a0", owner=ygov)
    stratFarmer = Contract("0xFc403fd9E7A916eC38437807704e92236cA1f7A5", owner=me)
    keeper = "0x7495B77b15fCb52fbb7BCB7380335d819ce4c04B"
    masterchef = "0xd7fa57069E4767ddE13aD7970A562c43f03f8365"
    reward = "0xf33121A2209609cAdc7349AcC9c40E41CE21c730"
    router = "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D"
    pid = 2
    tx = stratFarmer.cloneStrategy(
        usdc_vault, me, sharerV4, keeper, masterchef, reward, router, pid, {"from": me}
    )
    strategy = StrategyLegacy.at(tx.events["Cloned"]["clone"])
    # Remove idleusdc to replace it with farmer strat
    usdc_vault.updateStrategyDebtRatio(idleusdc, 0)
    # Add strategy to vault
    usdc_vault.addStrategy(strategy, 500, 0, 1000)
    # Remove funds from idleusdc
    idleusdc.harvest()
    strategy.harvest({"from": me})
    # Get initial deposit
    initialDeposit = strategy.estimatedTotalAssets()
    for i in range(15):
        waitBlock = random.randint(10, 20)
        # print(f'\n----wait {waitBlock} blocks----')
        chain.mine(waitBlock)
        strategy.harvest({"from": me})
        chain.sleep(waitBlock * 13)

    strategy.harvest({"from": me})
    # check strategy made a profit
    assert strategy.estimatedTotalAssets() > initialDeposit

    # Assume farm is over,lets exit the farm
    # Set emergencyexit
    strategy.setEmergencyExit({"from": me})
    # Call harvest to get funds out
    strategy.harvest({"from": me})
    # Check if the funds got out successfully
    assert strategy.estimatedTotalAssets() == 0

    # Lets add back idleusdc farming to vault
    usdc_vault.updateStrategyDebtRatio(idleusdc, 500)
    # we should harvest and get back the tvl on idleusdc
    idleusdc.harvest({"from": ygov})
    assert idleusdc.estimatedTotalAssets() > 0
def test_live_dai(accounts):

    me = accounts.at("0x7495B77b15fCb52fbb7BCB7380335d819ce4c04B", force=True)
    ygov = accounts.at("0xFEB4acf3df3cDEA7399794D0869ef76A6EfAff52", force=True)
    dai_vault = Contract("0x19D3364A399d251E894aC732651be8B0E4e85001", owner=ygov)
    sharerV4 = Contract("0xc491599b9a20c3a2f0a85697ee6d9434efa9f503")
    iblevcomp = Contract("0x77b7CD137Dd9d94e7056f78308D7F65D2Ce68910", owner=ygov)
    keeper = "0x7495B77b15fCb52fbb7BCB7380335d819ce4c04B"
    masterchef = "0xd7fa57069E4767ddE13aD7970A562c43f03f8365"
    reward = "0xf33121A2209609cAdc7349AcC9c40E41CE21c730"
    router = "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D"
    pid = 3
    strategy = StrategyLegacy.deploy(
        dai_vault, masterchef, reward, router, pid, {"from": me},
    )
    # Remove iblevcomp to replace it with farmer strat
    dai_vault.updateStrategyDebtRatio(iblevcomp, 0)
    # Add strategy to vault
    dai_vault.addStrategy(strategy, 5.5 * 100, 0, 1000)
    # Remove funds from iblevcomp
    iblevcomp.harvest()
    strategy.harvest({"from": me})
    # Get initial deposit
    initialDeposit = strategy.estimatedTotalAssets()
    for i in range(15):
        waitBlock = random.randint(10, 50)
        # print(f'\n----wait {waitBlock} blocks----')
        chain.mine(waitBlock)
        strategy.harvest({"from": me})
        chain.sleep(waitBlock * 13)

    strategy.harvest()
    # check strategy made a profit
    assert strategy.estimatedTotalAssets() > initialDeposit

    # Assume farm is over,lets exit the farm
    # Set emergencyexit
    strategy.setEmergencyExit({"from": me})
    # Call harvest to get funds out
    strategy.harvest({"from": me})
    # Check if the funds got out successfully
    assert strategy.estimatedTotalAssets() == 0

    # Lets add back iblev farming to vault
    dai_vault.updateStrategyDebtRatio(iblevcomp, 5.5 * 100)
    # we should harvest and get back the tvl on iblev
    iblevcomp.harvest({"from": ygov})
    assert iblevcomp.estimatedTotalAssets() > 0
예제 #3
0
def test_no_emissions(chain, usdc, whale, gov, strategist, rando, vault,
                      Strategy, strategy, GenericAave, aUsdc):
    # Clone magic
    vault = Contract("0xa5cA62D95D24A4a350983D5B8ac4EB8638887396"
                     )  # using SUSD vault (it is not in the LP program)

    tx = strategy.clone(vault)
    cloned_strategy = Strategy.at(tx.return_value)
    cloned_strategy.setWithdrawalThreshold(strategy.withdrawalThreshold(),
                                           {"from": vault.governance()})
    cloned_strategy.setDebtThreshold(strategy.debtThreshold(),
                                     {"from": vault.governance()})
    cloned_strategy.setProfitFactor(strategy.profitFactor(),
                                    {"from": vault.governance()})
    cloned_strategy.setMaxReportDelay(strategy.maxReportDelay(),
                                      {"from": vault.governance()})

    assert cloned_strategy.numLenders() == 0
    aSUSD = interface.IAToken(
        "0x6c5024cd4f8a59110119c56f8933403a539555eb")  # aSUSD
    # Clone the aave lender
    original_aave = GenericAave.at(strategy.lenders(strategy.numLenders() - 1))
    tx = original_aave.cloneAaveLender(cloned_strategy, "ClonedAaveSUSD",
                                       aSUSD, False,
                                       {"from": vault.governance()})
    cloned_lender = GenericAave.at(tx.return_value)
    assert cloned_lender.lenderName() == "ClonedAaveSUSD"

    cloned_strategy.addLender(cloned_lender, {"from": vault.governance()})
    currency = interface.ERC20(
        "0x57ab1ec28d129707052df4df418d58a2d46d5f51")  #sUSD
    susd_whale = "0x49be88f0fcc3a8393a59d3688480d7d253c37d2a"
    currency.transfer(strategist, 100e18, {'from': susd_whale})
    starting_balance = currency.balanceOf(strategist)

    decimals = currency.decimals()

    currency.approve(vault, 2**256 - 1, {"from": whale})
    currency.approve(vault, 2**256 - 1, {"from": strategist})

    deposit_limit = 1_000_000_000 * (10**(decimals))
    debt_ratio = 10_000
    vault.updateStrategyDebtRatio(vault.withdrawalQueue(0), 0,
                                  {'from': vault.governance()})
    vault.updateStrategyDebtRatio(vault.withdrawalQueue(1), 0,
                                  {'from': vault.governance()})
    vault.addStrategy(cloned_strategy, debt_ratio, 0, 2**256 - 1, 500,
                      {"from": vault.governance()})
    vault.setDepositLimit(deposit_limit, {"from": vault.governance()})

    assert deposit_limit == vault.depositLimit()
    with brownie.reverts():
        cloned_lender.setIsIncentivised(True, {'from': strategist})
    # ------------------ set up proposal ------------------

    # chain.sleep(12 * 3600) # to be able to execute
    # chain.mine(1)
    # print("executing proposal 11") # to be able to test before the proposal is executed
    # executor = Contract.from_abi("AaveGovernanceV2", "0xec568fffba86c094cf06b22134b23074dfe2252c", executor_abi, owner="0x30fe242a69d7694a931791429815db792e24cf97")
    # tx = executor.execute(11)

    # should fail because sUSD is not incentivised
    with brownie.reverts():
        cloned_lender.setIsIncentivised(True, {'from': strategist})
# our humble strategist deposits some test funds
    depositAmount = 50 * (10**(decimals))
    vault.deposit(depositAmount, {"from": strategist})

    assert cloned_strategy.estimatedTotalAssets() == 0
    chain.mine(1)
    assert cloned_strategy.harvestTrigger(1) == True

    cloned_strategy.harvest({"from": strategist})

    assert (cloned_strategy.estimatedTotalAssets() >= depositAmount * 0.999999
            )  # losing some dust is ok

    assert cloned_strategy.harvestTrigger(1) == False

    assert cloned_lender.harvestTrigger(1) == False  # harvest is unavailable

    with brownie.reverts():
        cloned_lender.harvest({'from':
                               strategist})  # if called, it does not revert

    assert cloned_lender.harvestTrigger(1) == False

    chain.sleep(10 * 3600 * 24 + 1)  # we wait 10 days for the cooldown period
    chain.mine(1)

    assert cloned_lender.harvestTrigger(1) == False  # always unavailable

    cloned_strategy.harvest({'from': strategist})
    chain.sleep(6 * 3600)
    chain.mine(1)
    vault.withdraw({"from": strategist})