Jupiter DCA SDK
This SDK is an abstraction to interact with Jup's DCA Program.
Install
npm i @jup-ag/dca-sdk
Example Usage
import { CloseDCAParams, CreateDCAParamsV2, DCA, DepositParams, WithdrawParams, Network } from 'jup-dca-sdk';
import { Connection, Keypair, PublicKey, sendAndConfirmTransaction } from '@solana/web3.js';
import dotenv from 'dotenv';
dotenv.config();
const connection = new Connection('https://api.devnet.solana.com');
const dca = new DCA(connection, Network.DEVNET);
const user = Keypair.fromSecretKey(new Uint8Array(JSON.parse(process.env.USER_PRIVATE_KEY)));
const USDC_DEVNET = new PublicKey('Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr');
const RANDOM_TOKEN = new PublicKey('EJwZgeZrdC8TXTQbQBoL6bfuAnFUUy1PVCMB4DYPzVaS');
async function createDCA() {
const params: CreateDCAParamsV2 = {
payer: payer.publicKey,
user: user.publicKey,
inAmount: BigInt(5_000_000),
inAmountPerCycle: BigInt(1_000_000),
cycleSecondsApart: BigInt(86400),
inputMint: USDC_DEVNET,
outputMint: RANDOM_TOKEN,
minOutAmountPerCycle: null,
maxOutAmountPerCycle: null,
startAt: null,
userInTokenAccount,
};
const { tx, dcaPubKey } = await dca.createDcaV2(params);
const txid = await sendAndConfirmTransaction(connection, tx, [user, payer]);
console.log('Create DCA: ', { txid });
return dcaPubKey;
}
async function withdraw(dcaPubKey) {
const params: WithdrawParams = {
user: user.publicKey,
dca: dcaPubKey,
inputMint: USDC_DEVNET,
withdrawInAmount: BigInt(1_000_000),
};
const { tx } = await dca.withdraw(params);
const txid = await sendAndConfirmTransaction(connection, tx, [user]);
console.log('Withdraw: ', { txid });
}
async function closeDCA(dcaPubKey) {
const params: CloseDCAParams = {
user: user.publicKey,
dca: dcaPubKey,
};
const { tx } = await dca.closeDCA(params);
const txid = await sendAndConfirmTransaction(connection, tx, [user]);
console.log('Close DCA: ', { txid });
}
async function main() {
const dcaPubKey = await createDCA();
console.log('DCA Pub Key: ', { dcaPubKey });
const dcaAccount = await dca.fetchDCA(dcaPubKey);
console.log('DCA Account Data: ', { dcaAccount });
const dcaAccounts = await dca.getCurrentByUser(user.publicKey);
console.log({ dcaAccounts });
await dca.getBalancesByAccount(dcaPubKey);
await withdraw(dcaPubKey);
await closeDCA(dcaPubKey);
}
main();
Change Log
2.0.7
- Renamed
getAllByUser
to getCurrentByUser
. This method name reflects more accurately the return value of the method -> returns all active DCA accounts (not closed) - Added
getClosedByUser
. This method returns DCA Accounts that are already closed and not returned by getCurrentByUser
.
getClosedByUser
returns different values from getCurrentByUser
because it is no longer on the blockchain. E.g.:
[
{
createdAt: <BN: 64820460>,
updatedAt: <BN: 6487378a>,
userKey: [PublicKey [PublicKey(EKnD4oLXP3B2uDigQiUmQHEBX6fBt33kJBWjQRmVgpXB)]],
dcaKey: [PublicKey [PublicKey(Dtkhyuhv5X3nPtU47JSTh4PRQLo5vuUYdHz6vtvX6b1a)]],
inputMint: [PublicKey [PublicKey(EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v)]],
outputMint: [PublicKey [PublicKey(So11111111111111111111111111111111111111112)]],
inDeposited: <BN: 989680>,
inAmountPerCycle: <BN: 1e8480>,
cycleFrequency: <BN: 3c>
},
{
createdAt: <BN: 64873dbb>,
updatedAt: <BN: 64873ef2>,
userKey: [PublicKey [PublicKey(EKnD4oLXP3B2uDigQiUmQHEBX6fBt33kJBWjQRmVgpXB)]],
dcaKey: [PublicKey [PublicKey(AK7fnjQW3XPcy13NjcAp1mbUCezUTkSvxcabYvj83HiL)]],
inputMint: [PublicKey [PublicKey(EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v)]],
outputMint: [PublicKey [PublicKey(So11111111111111111111111111111111111111112)]],
inDeposited: <BN: 989680>,
inAmountPerCycle: <BN: 1e8480>,
cycleFrequency: <BN: 3c>
}
]
- You can stil get fill history of the closed account with
getFillHistory
e.g. getFillHistory(closedDcaAccounts[0].publicKey)
- Added
trackDca
. Not meant to be used directly. This automatically gets called when creating a new DCA account so that our tracker keeps a off chain record of the DCA Account data and maintain its data even after the dca account has been deleted on-chain