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