Example #1
0
def test_migration(token, strategy, chain, vault, whale, gov, strategist,
                   StrategyCurveLINKVoterProxy):
    debt_ratio = 10_000
    vault.addStrategy(strategy, debt_ratio, 0, 2**256 - 1, 1000, {"from": gov})

    token.approve(vault, 2**256 - 1, {"from": whale})
    vault.deposit(Wei("100 ether"), {"from": whale})
    strategy.harvest({"from": strategist})

    genericStateOfStrat(strategy, token, vault)
    genericStateOfVault(vault, token)

    chain.sleep(2592000)
    chain.mine(1)

    print(
        "\nEstimated APR: ",
        "{:.2%}".format(
            ((vault.totalAssets() - 100 * 1e18) * 12) / (100 * 1e18)),
    )

    strategy2 = strategist.deploy(StrategyCurveLINKVoterProxy, vault)
    vault.migrateStrategy(strategy, strategy2, {"from": gov})
    genericStateOfStrat(strategy, token, vault)
    genericStateOfStrat(strategy2, token, vault)
    genericStateOfVault(vault, token)
Example #2
0
def test_clone(accounts, strategy, strategist, rewards, keeper, vault, Strategy, gov, dai, dai_vault, rook, rook_whale,
               amount, marketplace, pool, rook_distributor, weth, zero_address):
    with brownie.reverts():
        strategy.init(dai_vault, strategist, rewards, keeper, pool, gov, rook_distributor, zero_address, {"from": gov})

    transaction = strategy.clone(dai_vault, strategist, rewards, keeper, pool, gov, rook_distributor, zero_address,
                                 {"from": gov})
    cloned_strategy = Strategy.at(transaction.return_value)
    assert cloned_strategy.name() == "StrategyRook Dai Stablecoin"

    with brownie.reverts():
        cloned_strategy.init(dai_vault, strategist, rewards, keeper, pool, gov, rook_distributor, zero_address,
                             {"from": gov})

    # test harvest for cloned strategy
    # dai whale
    amount = 1 * 10 ** dai.decimals()
    reserve = accounts.at("0xd551234ae421e3bcba99a0da6d736074f22192ff", force=True)
    dai.transfer(accounts[0], amount, {"from": reserve})

    token = dai
    vault = dai_vault
    strategy = cloned_strategy

    # Deposit to the vault
    token.approve(vault.address, amount, {"from": accounts[0]})
    vault.deposit(amount, {"from": accounts[0]})
    vault.addStrategy(strategy, 10_000, 0, 1000, {"from": gov})
    assert token.balanceOf(vault.address) == amount
    #
    # harvest
    strategy.harvest({"from": gov})

    # assert eta is there, accouting for deposit fee

    assert pytest.approx(strategy.estimatedTotalAssets(), rel=amount * 0.0064) == amount

    assets_before = vault.totalAssets()

    # There isn't a way to simulate rewards from the distributor as it requires data from an offchain heroku app
    # The heroku app is updated from mainnet data and is not open sourced

    # arbitrary reward amount from a whale
    rook.transfer(strategy.address, 100 * 10 ** 18, {"from": rook_whale})
    print(f'\n---- before harvest')
    strategyBreakdown(strategy, token, vault)
    genericStateOfVault(vault, token)
    strategy.harvest({"from": gov})

    print(f'\n---- after harvest')
    strategyBreakdown(strategy, token, vault)
    genericStateOfVault(vault, token)

    assert vault.totalAssets() > assets_before
Example #3
0
def test_emergency_exit(accounts, token, vault, strategy, strategist, amount):
    # Deposit to the vault
    token.approve(vault.address, amount, {"from": accounts[0]})
    vault.deposit(amount, {"from": accounts[0]})
    strategy.harvest()
    assert strategy.estimatedTotalAssets() > amount * .99

    # set emergency and exit
    strategy.setEmergencyExit()
    strategy.harvest()
    assert strategy.estimatedTotalAssets() == 0

    genericStateOfVault(vault, token)
Example #4
0
def test_revoke_strategy_from_vault(token, vault, strategy, amount, gov):
    # Deposit to the vault and harvest
    token.approve(vault.address, amount, {"from": gov})
    vault.deposit(amount, {"from": gov})
    strategy.harvest()
    genericStateOfVault(vault, token)
    strategyBreakdown(strategy, token, vault)
    assert strategy.estimatedTotalAssets() > amount * .99

    # In order to pass this tests, you will need to implement prepareReturn.
    vault.revokeStrategy(strategy.address, {"from": gov})
    strategy.harvest()
    genericStateOfVault(vault, token)
    strategyBreakdown(strategy, token, vault)
    assert token.balanceOf(vault.address) > amount * .99
Example #5
0
def test_revoke_from_vault(token, strategy, vault, whale, gov, strategist):
    print("\n----test revoke----")

    debt_ratio = 10_000
    vault.addStrategy(strategy, debt_ratio, 0, 2**256 - 1, 1000, {"from": gov})

    token.approve(vault, 2**256 - 1, {"from": whale})
    initial_deposit = 100 * 1e18
    vault.deposit(initial_deposit, {"from": whale})

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

    genericStateOfStrat(strategy, token, vault)
    genericStateOfVault(vault, token)

    vault.revokeStrategy(strategy, {"from": gov})
    print("\n-----revoked-----")

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

    genericStateOfStrat(strategy, token, vault)
    genericStateOfVault(vault, token)
Example #6
0
def test_ops(token, strategy, chain, vault, whale, gov, strategist):
    print("\n----test ops----")

    debt_ratio = 10_000
    vault.addStrategy(strategy, debt_ratio, 0, 2**256 - 1, 1000, {"from": gov})

    token.approve(vault, 2**256 - 1, {"from": whale})
    initial_deposit = 100 * 1e18
    whalebefore = token.balanceOf(whale)
    vault.deposit(initial_deposit, {"from": whale})

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

    print("\n-----harvest-----")

    genericStateOfStrat(strategy, token, vault)
    genericStateOfVault(vault, token)

    print("\n-----sleep for a month-----")

    chain.sleep(2592000)
    chain.mine(1)

    strategy.harvest({"from": strategist})
    print("\n-----harvest-----")
    print("crvIB = ", token.balanceOf(strategy) / 1e18)

    genericStateOfStrat(strategy, token, vault)
    genericStateOfVault(vault, token)

    print(
        "\nEstimated APR: ",
        "{:.2%}".format(
            ((vault.totalAssets() - initial_deposit) * 12) / initial_deposit),
    )

    vault.withdraw({"from": whale})
    print("\n-----withdraw-----")
    genericStateOfStrat(strategy, token, vault)
    genericStateOfVault(vault, token)

    print(f"\nWhale profit: ", (token.balanceOf(whale) - whalebefore) / 1e18)
Example #7
0
def test_profitable_harvest(accounts, token, vault, strategy, strategist,
                            amount, rook_whale, rook, chain):
    # Deposit to the vault
    token.approve(vault.address, amount, {"from": accounts[0]})
    vault.deposit(amount, {"from": accounts[0]})
    assert token.balanceOf(vault.address) == amount
    #
    # harvest
    strategy.harvest()
    assert pytest.approx(strategy.estimatedTotalAssets(),
                         rel=amount * 0.0064) == amount

    assets_before = vault.totalAssets()

    before_pps = vault.pricePerShare()
    strategy.harvest()
    chain.sleep(3600 * 6)  # 6 hrs needed for profits to unlock
    chain.mine(1)

    # There isn't a way to simulate rewards from the distributor as it requires data from an offchain heroku app
    # The heroku app is updated from mainnet data and is not open sourced

    # arbitrary reward amount from a whale
    rook.transfer(strategy.address, 100 * 10**18, {"from": rook_whale})
    print(f'\n---- sell some rewards')
    strategyBreakdown(strategy, token, vault)
    genericStateOfVault(vault, token)

    strategy.sellSome(10 * 10**18, {"from": strategist})

    print(f'\n---- before harvest')
    strategyBreakdown(strategy, token, vault)
    genericStateOfVault(vault, token)
    strategy.harvest()

    print(f'\n---- after harvest')
    strategyBreakdown(strategy, token, vault)
    genericStateOfVault(vault, token)

    assert vault.totalAssets() > assets_before
    assert vault.pricePerShare() > before_pps