diff --git a/.changeset/fair-gifts-draw.md b/.changeset/fair-gifts-draw.md new file mode 100644 index 000000000..88ac7159b --- /dev/null +++ b/.changeset/fair-gifts-draw.md @@ -0,0 +1,5 @@ +--- +'@galacticcouncil/sdk-next': patch +--- + +Added dcaSell function diff --git a/packages/sdk-next/src/sor/TradeScheduler.ts b/packages/sdk-next/src/sor/TradeScheduler.ts index c7c5ec9f1..a07821e8c 100644 --- a/packages/sdk-next/src/sor/TradeScheduler.ts +++ b/packages/sdk-next/src/sor/TradeScheduler.ts @@ -403,6 +403,30 @@ export class TradeScheduler { } as TradeOrder; } + /** + * Build a DCA sell order (TWAP sell executed as DCA) + * + * @param assetIn - assetIn id + * @param assetOut - assetOut id + * @param amountInTotal - order budget + * @returns dca sell trade order + */ + async getDcaSellOrder( + assetIn: number, + assetOut: number, + amountInTotal: string + ): Promise { + const order = await this.getTwapSellOrder(assetIn, assetOut, amountInTotal); + return { + ...order, + type: TradeOrderType.DcaSell, + toHuman: () => ({ + ...order.toHuman(), + type: TradeOrderType.DcaSell, + }), + }; + } + /** * Build a TWAP (Time-Weighted Average Price) buy order * diff --git a/packages/sdk-next/src/sor/types.ts b/packages/sdk-next/src/sor/types.ts index 2bab435d0..a0c763415 100644 --- a/packages/sdk-next/src/sor/types.ts +++ b/packages/sdk-next/src/sor/types.ts @@ -66,6 +66,7 @@ export interface TradeOrder extends Humanizer { export enum TradeOrderType { Dca = 'Dca', + DcaSell = 'DcaSell', TwapSell = 'TwapSell', TwapBuy = 'TwapBuy', } diff --git a/packages/sdk-next/src/tx/OrderTxBuilder.ts b/packages/sdk-next/src/tx/OrderTxBuilder.ts index eb7fddc4a..693cec2f7 100644 --- a/packages/sdk-next/src/tx/OrderTxBuilder.ts +++ b/packages/sdk-next/src/tx/OrderTxBuilder.ts @@ -59,6 +59,8 @@ export class OrderTxBuilder extends TxBuilder { switch (type) { case TradeOrderType.Dca: return this.buildDcaTx(); + case TradeOrderType.DcaSell: + return this.buildDcaSellTx(); case TradeOrderType.TwapSell: return this.buildTwapSellTx(); case TradeOrderType.TwapBuy: @@ -105,6 +107,43 @@ export class OrderTxBuilder extends TxBuilder { return this.wrapTx('DcaSchedule', tx); } + private async buildDcaSellTx(): Promise { + const { + amountIn, + assetIn, + assetOut, + tradeAmountIn, + tradePeriod, + tradeRoute, + } = this.order; + + let tx: Transaction = this.api.tx.DCA.schedule({ + schedule: { + owner: this.beneficiary, + period: tradePeriod, + max_retries: this.maxRetries, + total_amount: amountIn, + slippage: this.slippagePct * 10000, + stability_threshold: undefined, + order: Enum('Sell', { + asset_in: assetIn, + asset_out: assetOut, + amount_in: tradeAmountIn, + min_amount_out: 0n, + route: tradeRoute as any, + }), + }, + start_execution_block: undefined, + }); + + const hasDebt = await this.aaveUtils.hasBorrowPositions(this.beneficiary); + if (hasDebt) { + tx = await this.dispatchWithExtraGas(tx); + } + + return this.wrapTx('DcaSchedule.dcaSell', tx); + } + private async buildTwapSellTx(): Promise { const { amountIn,