The vault contract is a single-asset pool, used by bots to take flash-loans. Depositors of tokens into flash loan vaults benefit from fees paid when their vault is accessed for flash loans; the greater the volume, the more fees generated. Flash loan vaults are a great source of yield with no impermanent loss.
There are three types of fees associated to the vaults, namely flash_loan_fee
, protocol_fee
and burn_fee
.
The flash_loan_fee
remains in the vault, which makes the share's value of the liquidity provides to increase, benefiting all LPs.
The protocol_fee
goes to the protocol, and it is to be collected by the Fee Collector contract of the Liquidity Hub.
The protocol revenue is then distributed to WHALE stakers in the form of token buybacks.
The burn_fee
is used to burn a portion of the tokens when a flash-loan takes place.
Pools contain a feature toggle, containing the following properties: withdraw_enabled
, deposit_enabled
and flash_loan_enabled
.
Those features are ON
by default, but could be changed via governance. They could be changed in different scenarios,
the ones
we could envision include for example if a critical bug is found in a given feature, it could be shut down while is
being
fixed to avoid exploits. Additionally, if for example liquidity is desired to be migrated to another pool, deposits
could
be disabled to prevent bots or users to deposit liquidity in the pool.
The code for the vault contract can be found here.
The following are the messages that can be executed on the vault:
Instantiates a vault. Includes providing information about the asset infos, token contract code id and fees among others.
{% tabs %} {% tab title="Native/IBC token" %}
{
"owner": "inj1...",
"asset_info": {
"native_token": {
"denom": "inj"
}
},
"token_id": 123,
"vault_fees": {
"protocol_fee": {
"share": "0.01"
},
"flash_loan_fee": {
"share": "0.02"
},
"burn_fee": {
"share": "0.01"
}
},
"fee_collector_addr": "inj1...",
"token_factory_lp": true
}
{% endtab %}
{% tab title="CW20 token" %}
{
"owner": "juno1...",
"asset_info": {
"token": {
"contract_addr": "juno1..."
}
},
"token_id": 123,
"vault_fees": {
"protocol_fee": {
"share": "0.01"
},
"flash_loan_fee": {
"share": "0.02"
},
"burn_fee": {
"share": "0.01"
}
},
"fee_collector_addr": "juno1...",
"token_factory_lp": true
}
{% endtab %} {% endtabs %}
Key | Type | Description |
---|---|---|
owner |
String | Contract owner address |
asset_info |
AssetInfo | The asset info the vault shoudl manage |
token_id |
u64 | The code ID of the liquidity token to instantiate |
vault_fees |
VaultFee | The fees used for the vault |
fee_collector_addr |
String | The address of the fee collector contract |
token_factory_lp |
bool | If true, the vault will use the token factory to create the LP token. If false, it will use a cw20 token instead |
Migrates the vault contract.
{}
Deposits an amount of the vault's asset. The vault issues to the sender an amount of LP tokens proportional to the shares of the deposited amount into the vault. Note that in case of depositing a cw20 token, the message increase_allowance should be called on the cw20 token contract before you can transfer cw20 tokens to the vault.
{
"deposit": {
"amount": "1000"
}
}
Key | Type | Description |
---|---|---|
amount |
Uint128 | Amount to be deposited in the vault |
Performs a flash loan operation, executing the provided message. The msg
is a message in base64 of the operation to be
executed with the flash loan.
{
"flash_loan": {
"amount": "1000",
"msg": ""
}
}
Key | Type | Description |
---|---|---|
amount |
Uint128 | Amount for the flash loan |
msg |
Binary | Message to be executed with the flash loan, encoded in base64 |
Sends the accrued vault fees to the Fee Collector. This action can be triggered by anyone.
{
"collect_protocol_fees": {}
}
This message triggers a CallbackMsg
message, e.g. AfterTrade
which makes sure the borrowed funds plus vault fees are
returned after executing a flash loan. This message can only be called internally by the vault contract.
{
"callback": {
"after_trade": {
"old_balance": "10000",
"loan_amount": "10000"
}
}
}
Key | Type | Description |
---|---|---|
after_trade |
CallbackMsg::AfterTrade | Callback parameters verified balances by the end of the flash loan execution |
Updates the configuration of the vault.
{
"update_config": {
"flash_loan_enabled": true,
"deposit_enabled": true,
"withdraw_enabled": true,
"new_owner": "inj1...",
"new_vault_fees": {
"protocol_fee": {
"share": "0.01"
},
"flash_loan_fee": {
"share": "0.02"
},
"burn_fee": {
"share": "0.01"
}
},
"new_fee_collector_addr": "inj1..."
}
}
Key | Type | Description |
---|---|---|
flash_loan_enabled |
Option<bool> | Toggle for the flash loan functionality |
deposit_enabled |
Option<bool> | Toggle for the deposit functionality |
withdraw_enabled |
Option<bool> | Toggle for the withdraw functionality |
new_owner |
Option<String> | New owner address |
new_vault_fees |
Option<VaultFee> | New vault fees |
new_fee_collector_addr |
Option<String> | New fee collector address |
To withdraw from the vault, the user must burn the LP tokens they hold. To do that, the Send
message from the cw20
token contract should be used together with the Cw20HookMsg::Withdraw
message.
The following should be sent to the LP (CW20 token) contract.
{
"send": {
"contract": "vault_contract",
"amount": "1000",
"msg": "ewogICJ3aXRoZHJhdyI6IHt9Cn0="
}
}
where ewogICJ3aXRoZHJhdyI6IHt9Cn0=
is the base64 encoded message:
{
"withdraw": {}
}
Key | Type | Description |
---|---|---|
contract |
String | Vault contract address |
amount |
String | Amount of LP tokens to be withdrawn |
msg |
Binary | The Cw20HookMsg::Withdraw message |
Retrieves the configuration of the contract in a Config
response.
{% tabs %} {% tab title="Query" %}
{
"config": {}
}
{% endtab %}
{% tab title="Response (Config)" %}
{
"owner": "juno1...",
"asset_info": {
"native_token": {
"denom": "ujuno"
}
},
"flash_loan_enabled": true,
"deposit_enabled": true,
"withdraw_enabled": true,
"lp_asset": {
"native_token": {
"denom": "factory/migaloo1.../uLP"
}
},
"fee_collector_addr": "juno1...",
"fees": {
"protocol_fee": {
"share": "0.001"
},
"flash_loan_fee": {
"share": "0.002"
},
"burn_fee": {
"share": "0.001"
}
}
}
Key | Type | Description |
---|---|---|
owner |
Addr | The owner of the vault |
asset_info |
AssetInfo | The asset info the vault manages |
flash_loan_enabled |
bool | If flash-loans are enabled |
deposit_enabled |
bool | If deposits are enabled |
withdraw_enabled |
bool | If withdrawals are enabled |
lp_asset |
AssetInfo | The LP Asset |
fee_collector_addr |
Addr | The address of the fee collector |
fees |
VaultFee | The fees associated with this vault |
{% endtab %} {% endtabs %}
Retrieves the Uint128
amount that must be sent back to the contract to pay off a loan taken out, in
a PaybackAmountResponse
response.
{% tabs %} {% tab title="Query" %}
{
"get_payback_amount": {
"amount": "10000"
}
}
Key | Type | Description |
---|---|---|
amount |
Uint128 | Amount that must be sent back to the contract to pay off a loan taken out |
{% endtab %}
{% tab title="Response (PaybackAmountResponse)" %}
{
"payback_amount": "10030",
"protocol_fee": "10",
"flash_loan_fee": "20",
"burn_fee": "20"
}
Key | Type | Description |
---|---|---|
payback_amount |
Uint128 | The total amount that must be returned. Equivalent to amount + protocol_fee + flash_loan_fee |
protocol_fee |
Uint128 | The amount of fee paid to the protocol |
flash_loan_fee |
Uint128 | The amount of fee paid to vault holders |
burn_fee |
Uint128 | Fees that would be burned, if any, by executing a flashloan |
{% endtab %} {% endtabs %}
Retrieves the protocol fees on the vault. If all_time
is true
, it will return the fees collected since
the inception of the vault. On the other hand, if all_time
is set to false
, only the fees that has been accrued by
the vault but not collected by the fee collector will be returned.
{% tabs %} {% tab title="Query" %}
{
"protocol_fees": {
"all_time": false
}
}
Key | Type | Description |
---|---|---|
all_time |
bool | If true , will return the all time collected fees |
{% endtab %}
{% tab title="Response (ProtocolFeesResponse)" %}
{
"fees": {
"info": {
"native_token": {
"denom": "ujuno"
}
},
"amount": "47516"
}
}
Key | Type | Description |
---|---|---|
fees |
Asset | Fees collected accrued the vault |
{% endtab %} {% endtabs %}
Retrieves the fees that have been burned by vault.
{% tabs %} {% tab title="Query" %}
{
"burned_fees": {}
}
{% endtab %}
{% tab title="Response (ProtocolFeesResponse)" %}
{
"fees": {
"info": {
"native_token": {
"denom": "uhuahua"
}
},
"amount": "47516"
}
}
Key | Type | Description |
---|---|---|
fees |
Asset | Fees burned by the vault |
{% endtab %} {% endtabs %}
Retrieves the share of the assets stored in the vault that a given amount
of lp tokens is entitled to in a Uint128
response.
{% tabs %} {% tab title="Query" %}
{
"share": {
"amount": "1000"
}
}
Key | Type | Description |
---|---|---|
amount |
Uint128 | Amount of LP tokens to calculate the share of the assets stored in the vault |
{% endtab %}
{% tab title="Response (Uint128)" %}
{
"data": "10002558"
}
Key | Type | Description |
---|---|---|
data |
Uint128 | The share of assets sotred in the vault that the given amount of LP tokens is entitled to |
{% endtab %} {% endtabs %}