Non-custodial DEX Traded Funds (DTFs)
Last updated
Was this helpful?
Last updated
Was this helpful?
Despite the fact that the idea seems very simple, realizing its full potential is quite a challenge. In the process of researching and designing the described idea, we decided to focus on the basic implementation of the funds.
You can find the source code in , which contains
On-chain programs
Web3 Client
The minimum viable product will allow to
Create a new DTF
Deposit funds
Withdraw funds
Before proceeding directly to the creation of the fund, it is necessary to carry out preparatory work. At the moment this needs to be done manually, but in the future we plan to automate this process.
The first step is to create an SPL DTF token. This token will be issued when funds are deposited into the fund and burned when funds are withdrawn. Detailed documentation can be found here . To initialize DTF, we need the mint address of this token.
We create another account (Fund account) - this account will be the DTF address, using it we can get information about which tokens are included in the DTF basket, their proportions, current value.
You need to create multiple Vault accounts.
Multiple accounts for each storage token included in the basket
One for the base asset to be accepted by the foundation
Two accounts for managing fees: LQD and DTFs
Administrative. In the future, this account will be used to manage DTF. For example, to pause the fund, change fee or rebalance.
[writable]
Fund account.
[writable]
Fund token mint
[writable]
Fund vault account. for each of the N DTF's basket assets
[]
Fund vault authority
[]
LQD fee vault
[]
Initializer fee vault
[]
Rent sysvar
[writable]
Fund admin account
[writable]
Initial supply fund token account
[writable]
Fund vault account of basic asset
[]
spl-token program account
Instruction Data
Vault signer nonce: nonce for the vault authority address of the DTF.
Assets length: the number of assets included in the basket.
Pool name: the name of the DTF to create
Fee rate: amount of fees
Slippage divider: slip factor divider
Asset weights: distribution of weights of tokens in the basket
Fund token initial supply: the number of tokens that will be issued when the DTF is initialized
Swap basic asset for basket assets, in certain proportions (using DEX)
Transfers the assets received as a result of the swap to vaults
Issues DTF tokens to the user
Changes the offer value and balance
The formula by which the program calculates the amount of tokens to issue is as follows
The client is built using TypeScript, React and Effector, the client does not store key information and does not have access to user funds, it's completely open-source.
If you'd rather build the application yourself, please ensure you have nodejs/npm/yarn already installed locally.
The main page is designed to view information about existing DTFs,
DTF's Name, ticker and creation date
DTF Market Cap
DTF price in USD
DTF price change
User's current DTF balance
List of assets included in the basket and their percentage
The addresses and authority of the created accounts must be transferred during the initialization of the DTF. We recommend that you familiarize yourself with the test Below is a complete list of data that must be transferred when creating a fund, including the required system accounts.
The following data must also be passed to the instruction for creating a DTF. Check out
DTF initialization implies the mandatory investment of tokens included in the basket. You can use a graphical interface for this. Check it out on our . Since one of the main goals we are pursuing is to create a simple tool, DTF assumes that all inputs are made in a base asset, such as USDC. Thus, when the user wants to invest his funds, he can use the graphical interface, while it is assumed that the DTF program independently
This mechanic has client-side implementation, but in the future it is necessary to implement a separate on-chain program, and use oracles to calculate the price of the tokens. In the current implementation we are using Serum-Pool. You can get acquainted with it in the and find more .
Live demo available at .
Quick actions are also available to the user: Connect Wallet (), Deposit and Withdrawal