Beispiel #1
0
def main():
    dai = interface.ERC20('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2')
    strategy = YearnWethCreamStratV2.at(
        '0x97785a81B3505Ea9026b2aFFa709dfd0C9Ef24f6')
    vault = Vault.at('0xf20731f26e98516dd83bb645dd757d33826a37b5')

    print(f'strategy YearnWethCreamStratV2: {strategy.address}')
    print(f'Vault: {vault.address}')
    print(f'Vault name: {vault.name()} and symbol: {vault.symbol()}')
    strategist_confirmed = strategy.strategist()
    print(f'Strategy strategist: {strategist_confirmed}')

    account_name = input(f"What account to use?: ")
    dev = accounts.load(account_name)
    print(f"You are using: 'dev' [{dev.address}]")
    devDai = dai.balanceOf(dev).to('ether')
    print(f"You're DAI balance is: [{devDai}]")
    are_you_strategist = strategist_confirmed == dev.address
    print(f"Are you strategist? {are_you_strategist}")

    if input("Continue? y/[N]: ").lower() != "y":
        return

    deposit_limit = Wei('500 ether')
    deposit_limit_eth = deposit_limit.to('ether')

    if input(f"Set deposit limit to: {deposit_limit_eth}?").lower() != "y":
        return

# vault.setDepositLimit(deposit_limit, {"from": dev, 'gas_price':Wei("17 gwei")})

    if input(f"Add strategy: {strategy} ?").lower() != "y":
        return

    #vault.addStrategy(strategy, deposit_limit, deposit_limit, 500, {"from": dev, 'gas_price':Wei("17 gwei")})

    amount = Wei('0.1 ether')
    amountE = amount.to('ether')

    if input(f"approve: {amountE} WETH?").lower() != "y":
        return
    #dai.approve(vault, amount*100, {"from": dev, 'gas_price':Wei("17 gwei")})

    print('deposit amount:', amount.to('ether'))
    if input("Continue? y/[N]: ").lower() != "y":
        return
    #vault.deposit(amount, {"from": dev, 'gas_price':Wei("17 gwei")})

    print('harvest time')
    if input("Continue? y/[N]: ").lower() != "y":
        return

    strategy.harvest({"from": dev, 'gas_price': Wei("25 gwei")})
Beispiel #2
0
def deposit(amount, whale, dai, vault):
    weiAmount = Wei(amount)
    print('\n----user deposits----')
    dai.approve(vault, weiAmount, {'from': whale})
    print('deposit amount:', weiAmount.to('ether'))
    vault.deposit(weiAmount, {'from': whale})
    assert (dai.balanceOf(vault) == weiAmount, "Balance not arrived in vault")
Beispiel #3
0
def main():
    dai = interface.ERC20('0x6b175474e89094c44da98b954eedeac495271d0f')
    strategy = YearnDaiCompStratV2.at(
        '0x5b62F24581Ea4bc6d6C5C101DD2Ae7233E422884')
    vault = Vault.at('0x9B142C2CDAb89941E9dcd0B6C1cf6dEa378A8D7C')

    print(f'strategy YearnDaiCompStratV2: {strategy.address}')
    print(f'Vault: {vault.address}')
    print(f'Vault name: {vault.name()} and symbol: {vault.symbol()}')
    strategist_confirmed = strategy.strategist()
    print(f'Strategy strategist: {strategist_confirmed}')

    account_name = input(f"What account to use?: ")
    dev = accounts.load(account_name)
    print(f"You are using: 'dev' [{dev.address}]")
    devDai = dai.balanceOf(dev).to('ether')
    print(f"You're DAI balance is: [{devDai}]")
    are_you_strategist = strategist_confirmed == dev.address
    print(f"Are you strategist? {are_you_strategist}")

    if input("Continue? y/[N]: ").lower() != "y":
        return

    deposit_limit = Wei('100000 ether')
    deposit_limit_eth = deposit_limit.to('ether')

    if input(f"Set deposit limit to: {deposit_limit_eth}?").lower() != "y":
        return

    vault.setDepositLimit(deposit_limit, {
        "from": dev,
        'gas_price': Wei("17 gwei")
    })

    if input(f"Add strategy: {strategy} ?").lower() != "y":
        return

    vault.addStrategy(strategy, deposit_limit, deposit_limit, 50, {
        "from": dev,
        'gas_price': Wei("17 gwei")
    })

    amount = Wei('500 ether')
    amountE = amount.to('ether')

    if input(f"approve: {amountE} DAI?").lower() != "y":
        return
    dai.approve(vault, amount * 100, {
        "from": dev,
        'gas_price': Wei("17 gwei")
    })

    print('deposit amount:', amount.to('ether'))
    if input("Continue? y/[N]: ").lower() != "y":
        return
    vault.deposit(amount, {"from": dev, 'gas_price': Wei("17 gwei")})

    print('harvest time')
    if input("Continue? y/[N]: ").lower() != "y":
        return

    strategy.harvest({"from": dev, 'gas_price': Wei("16 gwei")})
def test_strategy(accounts, interface, chain, web3, history,
                  YearnCompDaiStrategy):
    user = accounts[0]
    whale = accounts.at("0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8",
                        force=True)
    ychad = accounts.at(web3.ens.resolve('ychad.eth'), force=True)

    solo = interface.ISoloMargin('0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e')
    comptroller = interface.ComptrollerI(
        '0x3d9819210a31b4961b30ef54be2aed79b9c9cd3b')
    dai = interface.ERC20('0x6b175474e89094c44da98b954eedeac495271d0f')
    cdai = interface.CErc20I('0x5d3a536e4d6dbd6114cc1ead35777bab948e3643')
    comp = interface.ERC20('0xc00e94cb662c3520282e6f5717214004a7f26888')
    controller = interface.IController(
        '0x9E65Ad11b299CA0Abefc2799dDB6314Ef2d91080')
    vault = interface.IVault(controller.vaults(dai))
    strategy = YearnCompDaiStrategy.deploy(controller, {'from': user})
    assert strategy.want() == vault.token() == dai
    strategy.setWithdrawalFee(0)
    strategy.setCollateralTarget('0.745 ether')
    with brownie.reverts("Target higher than collateral factor"):
        strategy.setCollateralTarget('0.75 ether')

    print('migrate strategy')
    controller.approveStrategy(dai, strategy, {'from': ychad})
    controller.setStrategy(dai, strategy, {'from': ychad})
    vault.setMin(10000, {'from': ychad})
    assert controller.strategies(dai) == strategy
    print('dai in vault:', dai.balanceOf(vault).to('ether'))

    print('deposit funds into new strategy')
    vault.earn({'from': user})
    print('balance of strategy:', strategy.balanceOf().to('ether'))

    amount = Wei('1000 ether')
    user_before = dai.balanceOf(whale)
    dai.approve(vault, amount, {'from': whale})
    print('deposit amount:', amount.to('ether'))
    vault.deposit(amount, {'from': whale})
    for i in count(1):
        print(f'\ndeposit {i}')
        vault.deposit(0, {'from': whale})
        vault.earn({'from': user})
        print('balance of strategy:', strategy.balanceOf().to('ether'))
        deposits, borrows = strategy.getCurrentPosition()
        print('deposits:', Wei(deposits).to('ether'))
        print('borrows:', Wei(borrows).to('ether'))
        collat = borrows / deposits
        leverage = 1 / (1 - collat)
        print(f'collat: {collat:.5%}')
        print(f'leverage: {leverage:.5f}x')
        print('liquidity:', strategy.getLiquidity().to('ether'))
        if collat >= strategy.collateralTarget() / 1.001e18:
            print('target leverage reached')
            break

    print('\nharvest')
    before = strategy.balanceOf()
    blocks_per_year = 2_300_000
    sample = 100
    chain.mine(sample)
    strategy.harvest()
    after = strategy.balanceOf()
    assert after >= before
    print('balance increase:', (after - before).to('ether'))
    print(
        f'implied apr: {(after / before - 1) * (blocks_per_year / sample):.8%}'
    )

    vault.withdrawAll({'from': whale})
    user_after = dai.balanceOf(whale)
    print(f'\nuser balance increase:', (user_after - user_before).to('ether'))
    assert user_after >= user_before

    for i in count(1):
        print(f'\ndeleverage {i}')
        strategy.emergencyDeleverage()
        print('balance of strategy:', strategy.balanceOf().to('ether'))
        deposits, borrows = strategy.getCurrentPosition()
        print('deposits:', Wei(deposits).to('ether'))
        print('borrows:', Wei(borrows).to('ether'))
        collat = borrows / deposits
        leverage = 1 / (1 - collat)
        print(f'collat: {collat:.5%}')
        print(f'leverage: {leverage:.5f}x')
        print('liquidity:', strategy.getLiquidity().to('ether'))
        if borrows == 0:
            print('successfully deleveraged')
            break
def test_huge_deposit_and_withdrawal(accounts, interface, chain, web3, history,
                                     YearnCompDaiStrategy):
    user = accounts[0]
    #whale has 29m dai
    whale = accounts.at("0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8",
                        force=True)
    ychad = accounts.at(web3.ens.resolve('ychad.eth'), force=True)

    solo = interface.ISoloMargin('0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e')
    comptroller = interface.ComptrollerI(
        '0x3d9819210a31b4961b30ef54be2aed79b9c9cd3b')
    dai = interface.ERC20('0x6b175474e89094c44da98b954eedeac495271d0f')
    cdai = interface.CErc20I('0x5d3a536e4d6dbd6114cc1ead35777bab948e3643')
    comp = interface.ERC20('0xc00e94cb662c3520282e6f5717214004a7f26888')

    controller = interface.IController(
        '0x9E65Ad11b299CA0Abefc2799dDB6314Ef2d91080')
    vault = interface.IVault(controller.vaults(dai))

    print(dai.balanceOf('0x3dfd23A6c5E8BbcFc9581d2E864a68feb6a076d3'))

    strategy = YearnCompDaiStrategy.deploy(controller, {'from': user})
    assert strategy.want() == vault.token() == dai
    strategy.setWithdrawalFee(0)

    print('migrate strategy')
    controller.approveStrategy(dai, strategy, {'from': ychad})
    controller.setStrategy(dai, strategy, {'from': ychad})
    vault.setMin(10000, {'from': ychad})
    assert controller.strategies(dai) == strategy
    print('dai in vault:', dai.balanceOf(vault).to('ether'))

    print('\n----deposit funds into new strategy----')
    vault.earn({'from': user})
    depositsO, borrows = strategy.getCurrentPosition()
    print('deposits:', Wei(depositsO).to('ether'))
    print('borrows:', Wei(borrows).to('ether'))
    if depositsO == 0:
        collat = 0
    else:
        collat = borrows / depositsO
    leverage = 1 / (1 - collat)
    print(f'collat: {collat:.5%}')
    print(f'leverage: {leverage:.5f}x')
    print('liquidity:', strategy.getLiquidity().to('ether'))

    print('\n----whale deposits----')

    #amount =dai.balanceOf(whale)
    amount = Wei('10000000 ether')
    dai.approve(vault, amount, {'from': whale})
    print('deposit amount:', amount.to('ether'))
    vault.deposit(amount, {'from': whale})
    vault.earn({'from': user})

    deposits, borrows = strategy.getCurrentPosition()
    assert deposits > depositsO
    print('deposits:', Wei(deposits).to('ether'))
    print('borrows:', Wei(borrows).to('ether'))
    if deposits == 0:
        collat = 0
    else:
        collat = borrows / deposits
    leverage = 1 / (1 - collat)
    print(f'collat: {collat:.5%}')
    print(f'leverage: {leverage:.5f}x')
    print('liquidity:', strategy.getLiquidity().to('ether'))

    #print('\n----disabling Aave----')
    #strategy.disableAave({'from': user})

    for i in count(1):
        print(f'\ndeposit {i}')
        strategy.harvest({'from': user})
        print('balance of strategy:', strategy.balanceOf().to('ether'))
        deposits, borrows = strategy.getCurrentPosition()
        print('deposits:', Wei(deposits).to('ether'))
        print('borrows:', Wei(borrows).to('ether'))
        collat = borrows / deposits
        leverage = 1 / (1 - collat)
        print(f'collat: {collat:.5%}')
        print(f'leverage: {leverage:.5f}x')
        print('liquidity:', strategy.getLiquidity().to('ether'))
        if collat >= strategy.collateralTarget() / 1.001e18:
            print('target leverage reached')
            break

    blocks_per_year = 2_300_000
    monthsTillLiquidation = strategy.getblocksUntilLiquidation() / (
        blocks_per_year / 12)
    print(f'{strategy.getblocksUntilLiquidation()} blocks till liquidation')
    print(f'{monthsTillLiquidation} months till liquidation')

    print('\n----whale withdraws large amount----')

    user_before = dai.balanceOf(whale)
    tx = vault.withdrawAll({'from': whale})
    print(tx.events['Leverage'])
    #print(tx.info())
    user_after = dai.balanceOf(whale)
    print(f'\nWhale withdrew:', (user_after - user_before).to('ether'))
    deposits, borrows = strategy.getCurrentPosition()
    print('deposits:', Wei(deposits).to('ether'))
    print('borrows:', Wei(borrows).to('ether'))
    if deposits == 0:
        collat = 0
    else:
        collat = borrows / deposits
    leverage = 1 / (1 - collat)
    print(f'collat: {collat:.5%}')
    print(f'leverage: {leverage:.5f}x')