Skip to main content

Operations procedures

Revoking a strategy with normal migration

Let's say we found a problem in one of the strategies and we want to return all funds. There are two ways of doing it.

The scripts below use the HEGIC vault as an example.

From the vault

# Grab the gov account
gov = accounts.at(vault.governance(), force=True)

# The cream strategy is the first in the withdrawal queue
s1 = Contract(vault.withdrawalQueue(0))

# Revoke msg should be sent from gov or guardian
vault.revokeStrategy(s1, {"from": gov})

After running the command you will notice:

vault.strategies(s1).dict()['debtRatio'] == 0

Last step is running a harvest to return funds to vault:

s1.harvest({"from": gov})
>>> hegic.balanceOf(s1)
0
>>> hegic.balanceOf(vault)/1e18
291731.2666932462

From the strategy

From the strategy itself we can turn on emergency mode. To do it we need to run:

# Grab the strategist account
strategist = accounts.at(s1.strategist(), force=True)

# Turn on the emergency exit
s1.setEmergencyExit({'from': strategist})

# Harvest to move funds to the vault
s1.harvest({'from': strategist})

We should also see the strategy's debtRatio going to 0 and funds returning to the vault.

Emergency Procedures

We can also shutdown the vault to return assets as soon as possible. To do that we will need a guardian or governance account:

# Sound the alarm
vault.setEmergencyShutdown(true, {'from': gov})

# Harvest all strategies
s1.harvest({'from': gov})
s2.harvest({'from': gov})
s3.harvest({'from': gov})

# Check all the tokens are back in the vault
>>> hegic.balanceOf(vault) == vault.totalAssets()
True

You will notice that this procedure doesn't change the debt ratio:

>>> vault.strategies(s1).dict()['debtRatio']
1600

It drops the credit to 0:

>>> vault.creditAvailable(s1)
0