Trading guide

In this section we will cover how one can:
  • Deposit
  • Lend at the Prime Variable Rate
  • Borrow at the Prime Borrow Rate
  • Buy fCash (Lend Fixed)
  • Sell fCash (Borrow Fixed)
  • Mint nTokens (Provide Liquidity)
  • Redeem nTokens (Redeem Liquidity)
  • Enter a leveraged vault
  • Exit a leveraged vault
We will also explore how to submit multiple actions in one trade and how to set slippage limits when trading fCash.

Helper functions

Here are some helper functions that can be useful when interacting with Notional balance and trading functions:
from eth_abi.packed import encode_abi_packed
DEPOSIT_ACTION_TYPE = {
"None": 0,
"DepositAsset": 1,
"DepositUnderlying": 2,
"DepositAssetAndMintNToken": 3,
"DepositUnderlyingAndMintNToken": 4,
"RedeemNToken": 5,
"ConvertCashToNToken": 6,
}
TRADE_ACTION_TYPE = {
"Lend": 0,
"Borrow": 1,
"AddLiquidity": 2,
"RemoveLiquidity": 3,
"PurchaseNTokenResidual": 4,
"SettleCashDebt": 5,
}
def get_balance_action(currencyId, depositActionType, **kwargs):
depositActionAmount = (
0 if "depositActionAmount" not in kwargs else kwargs["depositActionAmount"]
)
withdrawAmountInternalPrecision = (
0
if "withdrawAmountInternalPrecision" not in kwargs
else kwargs["withdrawAmountInternalPrecision"]
)
withdrawEntireCashBalance = (
False if "withdrawEntireCashBalance" not in kwargs else kwargs["withdrawEntireCashBalance"]
)
redeemToUnderlying = (
True if "redeemToUnderlying" not in kwargs else kwargs["redeemToUnderlying"]
)
return (
DEPOSIT_ACTION_TYPE[depositActionType],
currencyId,
int(depositActionAmount),
int(withdrawAmountInternalPrecision),
withdrawEntireCashBalance,
redeemToUnderlying,
)
def get_balance_trade_action(currencyId, depositActionType, tradeActionData, **kwargs):
tradeActions = [get_trade_action(**t) for t in tradeActionData]
balanceAction = list(get_balance_action(currencyId, depositActionType, **kwargs))
balanceAction.append(tradeActions)
return tuple(balanceAction)
def get_lend_action(currencyId, tradeActionData, depositUnderlying):
tradeActions = [get_trade_action(**t) for t in tradeActionData]
return (currencyId, depositUnderlying, tradeActions)
def get_trade_action(**kwargs):
tradeActionType = kwargs["tradeActionType"]
if tradeActionType == "Lend":
return encode_abi_packed(
["uint8", "uint8", "uint88", "uint32", "uint120"],
[
TRADE_ACTION_TYPE[tradeActionType],
kwargs["marketIndex"],
int(kwargs["notional"]),
int(kwargs["minSlippage"]),
0,
],
)
elif tradeActionType == "Borrow":
return encode_abi_packed(
["uint8", "uint8", "uint88", "uint32", "uint120"],
[
TRADE_ACTION_TYPE[tradeActionType],
kwargs["marketIndex"],
int(kwargs["notional"]),
int(kwargs["maxSlippage"]),
0,
],
)
elif tradeActionType == "AddLiquidity":
return encode_abi_packed(
["uint8", "uint8", "uint88", "uint32", "uint32", "uint88"],
[
TRADE_ACTION_TYPE[tradeActionType],
kwargs["marketIndex"],
int(kwargs["notional"]),
int(kwargs["minSlippage"]),
int(kwargs["maxSlippage"]),
0,
],
)
elif tradeActionType == "RemoveLiquidity":
return encode_abi_packed(
["uint8", "uint8", "uint88", "uint32", "uint32", "uint88"],
[
TRADE_ACTION_TYPE[tradeActionType],
kwargs["marketIndex"],
int(kwargs["notional"]),
int(kwargs["minSlippage"]),
int(kwargs["maxSlippage"]),
0,
],
)
elif tradeActionType == "PurchaseNTokenResidual":
return encode_abi_packed(
["uint8", "uint32", "int88", "uint128"],
[
TRADE_ACTION_TYPE[tradeActionType],
kwargs["maturity"],
int(kwargs["fCashAmountToPurchase"]),
0,
],
)
elif tradeActionType == "SettleCashDebt":
return encode_abi_packed(
["uint8", "address", "uint88"],
[
TRADE_ACTION_TYPE[tradeActionType],
kwargs["counterparty"],
int(kwargs["amountToSettle"]),
],
)