예제 #1
0
def mint_Aave(token: MintableForkToken, target: str, amount: int) -> bool:
    # Aave aTokens
    if not hasattr(token, "UNDERLYING_ASSET_ADDRESS"):
        return False

    token = MintableForkToken(token.UNDERLYING_ASSET_ADDRESS())
    lending_pool = Contract("0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9")
    token._mint_for_testing(target, amount)
    token.approve(lending_pool, amount, {"from": target})
    lending_pool.deposit(token, amount, target, 0, {"from": target})
    return True
예제 #2
0
    def _mint_for_testing(self, target, amount, tx=None):
        if self.address == "0x674C6Ad92Fd080e4004b2312b45f796a192D27a0":
            # USDN
            self.deposit(
                target, amount,
                {'from': "0x90f85042533F11b362769ea9beE20334584Dcd7D"})
            return
        if self.address == "0x0E2EC54fC0B509F445631Bf4b91AB8168230C752":
            # LinkUSD
            self.mint(target, amount,
                      {'from': "0x62F31E08e279f3091d9755a09914DF97554eAe0b"})
            return
        if self.address == "0x196f4727526eA7FB1e17b2071B3d8eAA38486988":
            # RSV
            self.changeMaxSupply(2**128, {'from': self.owner()})
            self.mint(target, amount, {'from': self.minter()})
            return
        if self.address == "0x5228a22e72ccC52d415EcFd199F99D0665E7733b":
            # pBTC
            self.mint(target, amount, {'from': self.pNetwork()})
            return
        if self.name().startswith("Aave"):
            underlying = _MintableTestToken(self.UNDERLYING_ASSET_ADDRESS())
            lending_pool = Contract(
                "0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9")

            underlying._mint_for_testing(target, amount)
            underlying.approve(lending_pool, amount, {'from': target})
            lending_pool.deposit(underlying, amount, target, 0,
                                 {'from': target})
            return

        for address in _holders[self.address].copy():
            if address == self.address:
                # don't claim from the treasury - that could cause wierdness
                continue

            balance = self.balanceOf(address)
            try:
                if amount > balance:
                    self.transfer(target, balance, {'from': address})
                    amount -= balance
                else:
                    self.transfer(target, amount, {'from': address})
                    return
            except Exception:
                # sometimes tokens just don't want to be stolen
                pass

        raise ValueError(
            f"Insufficient tokens available to mint {self.name()}")
예제 #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})