{"version":3,"sources":["webpack:///./src/routes/dca/dca.ts"],"names":["DCA","dialogService","ts","store","toast","controllerFactory","i18n","taskQueue","ss","loading","loadingDCA","chartDataBuy","chartDataSell","dswapEnabled","dswapPaused","maxSlippageInputToken","maxSlippageOutputToken","dcaRecurrenceTypeAmount","dcaOrderNo","recurrenceTypeValues","this","validationController","createForCurrentScope","renderer","addRenderer","storeSubscription","state","subscribe","user","firebaseUser","loggedIn","symbol","transactionType","tokens","getDSwapTokens","Hive","refreshTokenLists","createValidationRules","buyTokenSymbol","buyTokenSelected","sellTokenSymbol","sellTokenSelected","activePageId","currentChainId","queueTask","call","$","selectpicker","marketMakerFeeToken","EXCHANGE_URL_HE","t","find","x","metadata","icon","endsWith","refreshSelectPicker","dswapDcaFee","dcaTradesActive","getActiveDCARequests","dcaTradesHistory","getHistoricalDCARequests","validationResult","validate","result","results","valid","message","tr","rule","messageKey","buyTokenAmount","sellTokenAmount","sellTokenBalance","sellToken","userBalance","balance","dcaTradeValueUsd","metrics","parseFloat","lastPriceUsd","ns","error","swapRequestDcaModel","Account","account","name","Chain","ChainTransactionId","TokenOutput","TokenInput","TokenInputAmount","SwapSourceId","DSWAP_SOURCE_ID","TokenInputMemo","RecurrenceType","recurrenceTypeValue","RecurrenceTypeAmount","OrderCount","DCAType","MarketDCA","PoolTokenPair","open","viewModel","model","whenClosed","response","wasCancelled","loadDcaActive","buyTokens","sellTokens","filter","isCrypto","precision","buyToken","splice","indexOf","updateDcaSummary","chartRefBuy","detached","loadTokenHistoryData","attached","fillPeggedTokenMetrics","enrichTokensWithMetrics","getTokenBalance","calcUnitEstimateRate","token","loadUserBalances","getDSwapTokenBalances","tradePercentage","updateTradeValueUsd","tradeValueUsd","toFixed","getTokenSymbolToCheck","baseTokenSymbol","peggedTokenPrice","lastPrice","chartRefSell","console","log","percentage","ohlcData","slice","map","unix","timestamp","format","o","openPrice","h","highestPrice","l","lowestPrice","c","closePrice","num","fixed","re","RegExp","toString","match","tokenSymbol","tokenSymbolToCheck","tokenToCheck","dcaSellPerOrder","tradesActive","Init","InProgress","timestamp_month_name","CreatedAt","timestamp_day","timestamp_time","timestamp_year","SwapStatusName","SwapStatusId","dcaCancelRequests","d","Id","DCAId","CancelRequested","loadDCARequests","tradesHistory","Success","Failure","SuccessPartial","Cancelled","Expired","sortByStartDate","dcaId","dcaDetail","SwapRequestDCA","LastOrderDateTime","SwapRequests","i","DCARefunds","timeUntilNextOrder","activateDcaButton","trade","button","removeClass","addClass","date","Date","getTime","array","sort","a","b","aDate","toDate","bDate","rules","ensure","required","withMessageKey","then","satisfies","value","object","addObject"],"mappings":"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","file":"app~7d59d924.77f35229a31e824d3043.chunk.js","sourcesContent":["import { Redirect } from 'aurelia-router';\nimport { ToFixedValueConverter } from 'resources/value-converters/to-fixed';\nimport { Subscription } from 'rxjs';\nimport { customElement, autoinject, bindable, TaskQueue } from 'aurelia-framework';\nimport { DswapOrderDcaModal } from 'modals/dswap-order-dca';\nimport { DialogService } from 'aurelia-dialog';\nimport { Store, dispatchify } from 'aurelia-store';\nimport { ChartComponent } from 'components/chart/chart';\nimport { loadTokenMarketHistory, loadBuyBook, loadSellBook, loadTokens } from 'common/hive-engine-api';\nimport moment from 'moment';\nimport { getPrices, usdFormat, getChainByState, getPeggedTokenSymbolByChain, getSwapTokenByCrypto, getPeggedTokenPriceByChain, isNumeric, getSwapStatusById, getNextOrderDateTime } from 'common/functions';\nimport { getCurrentFirebaseUser, getMarketMakerUser } from 'store/actions';\nimport { TokenService } from 'services/token-service';\nimport { ValidationControllerFactory, ControllerValidateResult, ValidationRules } from 'aurelia-validation';\nimport { ToastService, ToastMessage } from 'services/toast-service';\nimport { BootstrapFormRenderer } from 'resources/bootstrap-form-renderer';\nimport { I18N } from 'aurelia-i18n';\nimport { environment } from 'environment';\nimport { Chain, DCAType, SwapStatus } from 'common/enums';\nimport { SwapService } from 'services/swap-service';\nimport { env } from 'process';\nimport { getDCACancelRequests, getSwapDCADetail, getSwapDCARequests } from 'common/dswap-api';\nimport { DswapSwapdetailsModal } from 'modals/dswap-swapdetails';\nimport { DswapOrderDcaCancelModal } from 'modals/dswap-order-dca-cancel';\n\n@autoinject()\n@customElement('dca')\nexport class DCA {\n public storeSubscription: Subscription;\n public state: IState;\n public buyTokens: IToken[];\n @bindable() sellTokens: IToken[];\n public buyTokenSymbol;\n public sellTokenSymbol;\n @bindable() sellTokenAmount;\n @bindable() buyTokenAmount;\n public buyToken : IToken;\n public sellToken : IToken;\n private unitEstimateRate;\n private tradeValueUsd;\n private loggedIn;\n @bindable() tradePercentage;\n @bindable() loading = false;\n @bindable() loadingDCA = false;\n \n private chartRefBuy: ChartComponent;\n private chartRefSell: ChartComponent;\n\n private chartDataBuy: any = {};\n private chartDataSell: any = {};\n private user;\n private validationController;\n private renderer; \n private dswapEnabled = false;\n private dswapPaused = false;\n private currentChainId;\n private baseTokenSymbol;\n private baseTokenAmount;\n private maxSlippageInputToken = 5.00;\n private maxSlippageOutputToken = 5.00;\n private recurrenceTypeValue;\n @bindable() dcaRecurrenceTypeAmount = 1;\n @bindable() dcaOrderNo = 2;\n private recurrenceTypeValues: string[] = [\"minute\", \"hour\", \"day\", \"week\", \"month\" ];\n private dcaSellPerOrder;\n private dswapDcaFee;\n @bindable() dcaTradesActive: ISwapRequestDCAViewModel[];\n @bindable() dcaTradesHistory: ISwapRequestDCAViewModel[];\n @bindable() dcaDetail: ISwapRequestDCADetailViewModel;\n @bindable() timeUntilNextOrder;\n\n constructor(private dialogService: DialogService, \n private ts: TokenService, \n private store: Store, \n private toast: ToastService, \n private controllerFactory: ValidationControllerFactory, \n private i18n: I18N,\n private taskQueue: TaskQueue,\n private ss: SwapService) {\n this.validationController = controllerFactory.createForCurrentScope();\n\n this.renderer = new BootstrapFormRenderer();\n this.validationController.addRenderer(this.renderer);\n this.storeSubscription = this.store.state.subscribe(state => {\n if (state) {\n this.state = state;\n \n this.user = { ...state.firebaseUser };\n this.loggedIn = state.loggedIn;\n }\n }); \n }\n\n async canActivate({ symbol, transactionType }) { \n try {\n if (!this.state.tokens) {\n await this.ts.getDSwapTokens(true, Chain.Hive);\n }\n await dispatchify(getCurrentFirebaseUser)();\n await dispatchify(getMarketMakerUser)();\n\n this.refreshTokenLists();\n this.createValidationRules();\n\n if (symbol && transactionType) {\n if (transactionType === \"buy\") {\n this.buyTokenSymbol = symbol;\n await this.buyTokenSelected();\n } else if (transactionType === \"sell\") {\n this.sellTokenSymbol = symbol;\n await this.sellTokenSelected();\n }\n }\n\n this.state.activePageId = \"dca\";\n this.currentChainId = await getChainByState(this.state); \n } catch {\n return new Redirect('');\n }\n }\n\n async refreshSelectPicker() {\n this.taskQueue.queueTask({\n call: () => $('.selectpicker').selectpicker(\"refresh\")\n }); \n }\n\n tokenImage(symbol) {\n if (symbol == environment.marketMakerFeeToken) {\n return environment.EXCHANGE_URL_HE + 'images/logo-small.png';\n } else {\n var t = this.state.tokens.find(x => x.symbol === symbol);\n if (t) {\n return t.metadata.icon.endsWith('.svg') ? t.metadata.icon : `https://images.hive.blog/0x0/${t.metadata.icon}`;\n }\n }\n }\n \n async attached() {\n this.refreshSelectPicker();\n this.dswapEnabled = environment.dswapEnabled;\n this.dswapPaused = environment.dswapPaused;\n this.dswapDcaFee = environment.dswapDcaFee + '%';\n this.dcaTradesActive = await this.getActiveDCARequests();\n this.dcaTradesHistory = await this.getHistoricalDCARequests();\n }\n\n async startTrade() {\n const validationResult: ControllerValidateResult = await this.validationController.validate();\n \n for (const result of validationResult.results) { \n if (!result.valid) {\n const toast = new ToastMessage();\n\n toast.message = this.i18n.tr(result.rule.messageKey, {\n buyTokenSymbol: this.buyTokenSymbol,\n sellTokenSymbol: this.sellTokenSymbol,\n buyTokenAmount: this.buyTokenAmount,\n sellTokenAmount: this.sellTokenAmount,\n sellTokenBalance: this.sellToken != null ? this.sellToken.userBalance.balance : \"\",\n dcaTradeValueUsd: this.sellToken != null && this.sellToken.metrics != null ? parseFloat(this.sellToken.metrics.lastPriceUsd) * this.sellTokenAmount : \"\",\n ns: 'errors' \n });\n \n this.toast.error(toast);\n }\n }\n\n if (validationResult.valid) {\n let swapRequestDcaModel: ISwapRequestDCAModel = {\n Account: this.state.account.name,\n Chain: Chain.Hive,\n ChainTransactionId: \"\",\n TokenOutput: this.buyTokenSymbol,\n TokenInput: this.sellTokenSymbol,\n TokenInputAmount: this.sellTokenAmount,\n SwapSourceId: environment.DSWAP_SOURCE_ID,\n TokenInputMemo: \"\",\n RecurrenceType: this.recurrenceTypeValue,\n RecurrenceTypeAmount: this.dcaRecurrenceTypeAmount,\n OrderCount: this.dcaOrderNo,\n DCAType: DCAType.MarketDCA,\n PoolTokenPair: \"\"\n }; \n\n this.loading = true;\n this.dialogService.open({ viewModel: DswapOrderDcaModal, model: swapRequestDcaModel }).whenClosed(response => { \n this.loading = false;\n if (!response.wasCancelled) {\n this.loadDcaActive(); \n }\n });\n }\n }\n\n async refreshTokenLists(){\n if (!this.state.tokens) {\n await this.ts.getDSwapTokens(true, Chain.Hive);\n }\n\n this.buyTokens = [...this.state.tokens];\n this.sellTokens = [...this.state.tokens];\n\n // filter out crypto from buy token list for now\n // filter out 0 precision tokens to prevent loss\n this.buyTokens = this.buyTokens.filter(x => !x.isCrypto && x.precision != 0);\n this.sellTokens = this.sellTokens.filter(x => x.precision != 0);\n \n if (this.buyToken)\n this.sellTokens.splice(this.sellTokens.indexOf(this.sellTokens.find(x => x.symbol == this.buyToken.symbol)), 1);\n\n if (this.sellToken)\n this.buyTokens.splice(this.buyTokens.indexOf(this.buyTokens.find(x => x.symbol == this.sellToken.symbol)), 1);\n\n await this.refreshSelectPicker();\n }\n\n async calcUnitEstimateRate() {\n if (this.buyToken && this.sellToken) {\n //this.unitEstimateRate = (this.buyToken.metrics.lastPrice / this.sellToken.metrics.lastPrice).toFixed(8);\n\n //await this.updateTradeValueUsd(); \n }\n }\n\n async recurrenceTypeSelected(){\n\n }\n\n async sellTokenAmountChanged() {\n this.updateDcaSummary();\n }\n\n async buyTokenSelected() { \n if (this.chartRefBuy)\n this.chartRefBuy.detached();\n\n this.chartDataBuy = await this.loadTokenHistoryData(this.buyTokenSymbol);\n\n if (this.chartRefBuy)\n this.chartRefBuy.attached();\n \n this.buyToken = this.state.tokens.find(x => x.symbol == this.buyTokenSymbol);\n this.fillPeggedTokenMetrics(this.buyToken);\n this.refreshTokenLists();\n\n if (!this.buyToken.metrics) {\n await this.ts.enrichTokensWithMetrics([this.buyToken], [this.buyToken.symbol], Chain.Hive);\n }\n\n if (!this.buyToken.userBalance)\n await this.getTokenBalance(this.buyToken);\n\n if (this.buyTokenAmount && this.buyTokenAmount > 0)\n this.buyTokenAmount = 0;\n \n await this.calcUnitEstimateRate(); \n }\n\n async getTokenBalance(token) { \n if (!token || !token.loadUserBalances) {\n await this.ts.getDSwapTokenBalances(Chain.Hive);\n } \n }\n\n async tradePercentageChanged(){\n if (this.buyToken && this.sellToken) {\n this.sellTokenAmount = (this.tradePercentage / 100) * this.sellToken.userBalance.balance;\n\n await this.updateTradeValueUsd();\n }\n }\n\n async dcaRecurrenceTypeAmountChanged(){\n this.updateDcaSummary();\n }\n\n async dcaOrderNoChanged() {\n this.updateDcaSummary();\n }\n\n async updateTradeValueUsd() {\n if (this.sellToken.metrics)\n this.tradeValueUsd = (this.sellTokenAmount * parseFloat(this.sellToken.metrics.lastPriceUsd)).toFixed(4);\n }\n\n async fillPeggedTokenMetrics(token) {\n let symbolToCheck = await this.getTokenSymbolToCheck(token.symbol);\n if (symbolToCheck == this.baseTokenSymbol) {\n let peggedTokenPrice = await getPeggedTokenPriceByChain(this.currentChainId);\n token.metrics = { lastPriceUsd: peggedTokenPrice, lastPrice: peggedTokenPrice };\n }\n }\n\n async sellTokenSelected() {\n if (this.chartRefSell)\n this.chartRefSell.detached();\n\n this.chartDataSell = await this.loadTokenHistoryData(this.sellTokenSymbol);\n\n if (this.chartRefSell)\n this.chartRefSell.attached();\n \n this.sellToken = this.state.tokens.find(x => x.symbol == this.sellTokenSymbol);\n\n if (!this.sellToken.metrics) {\n await this.ts.enrichTokensWithMetrics([this.sellToken], [this.sellToken.symbol], Chain.Hive);\n }\n\n console.log(this.sellToken);\n this.fillPeggedTokenMetrics(this.sellToken);\n this.refreshTokenLists();\n\n if (!this.sellToken.userBalance)\n await this.getTokenBalance(this.sellToken);\n\n if (this.sellTokenAmount && this.sellTokenAmount > 0)\n this.sellTokenAmount = 0;\n\n await this.calcUnitEstimateRate(); \n }\n\n async slideTo(percentage) {\n this.tradePercentage = percentage;\n }\n\n async loadTokenHistoryData(token) {\n const tokenHistory = await loadTokenMarketHistory(token);\n const limitCandleStick = 30; // show last 30 days\n\n const candleStickData = tokenHistory.slice(0, limitCandleStick).map(x => {\n return {\n t: moment.unix(x.timestamp).format('YYYY-MM-DD HH:mm:ss'), //x.timestamp * 1000,\n o: x.openPrice,\n h: x.highestPrice,\n l: x.lowestPrice,\n c: x.closePrice,\n };\n });\n\n return { ohlcData: candleStickData };\n }\n\n public toFixed(num, fixed) {\n var re = new RegExp('^-?\\\\d+(?:\\.\\\\d{0,' + (fixed || -1) + '})?');\n return num.toString().match(re)[0];\n }\n\n async getTokenSymbolToCheck(tokenSymbol) {\n let tokenSymbolToCheck = tokenSymbol;\n let tokenToCheck = this.state.tokens.find(x => x.symbol == tokenSymbol);\n if (tokenToCheck && tokenToCheck.isCrypto)\n tokenSymbolToCheck = getSwapTokenByCrypto(tokenSymbol);\n\n return tokenSymbolToCheck;\n }\n\n updateDcaSummary() {\n this.dcaSellPerOrder = this.sellTokenAmount / this.dcaOrderNo;\n }\n\n // DCA overview & history\n async getActiveDCARequests(){ \n this.loadingDCA = true;\n let tradesActive = await getSwapDCARequests(this.state.account.name, 100, 0, DCAType.MarketDCA, [SwapStatus.Init, SwapStatus.InProgress]);\n for (let t of tradesActive) {\n t.timestamp_month_name = moment(t.CreatedAt).format('MMMM');\n t.timestamp_day = moment(t.CreatedAt).format('DD');\n t.timestamp_time = moment(t.CreatedAt).format('HH:mm');\n t.timestamp_year = moment(t.CreatedAt).format('YYYY');\n t.SwapStatusName = await getSwapStatusById(t.SwapStatusId);\n }\n\n let dcaCancelRequests = await getDCACancelRequests(this.state.account.name, SwapStatus.Init);\n for (let t of tradesActive) {\n for (let d of dcaCancelRequests) {\n if (t.Id == d.DCAId) {\n t.CancelRequested = true;\n }\n }\n }\n\n this.loadingDCA = false;\n \n return tradesActive;\n }\n\n async refreshDcaOverview(){\n this.loadingDCA = true;\n await this.loadDCARequests();\n this.loadingDCA = false;\n }\n\n async getHistoricalDCARequests(){\n this.loadingDCA = true;\n let tradesHistory = await getSwapDCARequests(this.state.account.name, 100, 0, DCAType.MarketDCA, [SwapStatus.Success, SwapStatus.Failure, SwapStatus.SuccessPartial, SwapStatus.Cancelled, SwapStatus.Expired]);\n for (let t of tradesHistory) {\n t.timestamp_month_name = moment(t.CreatedAt).format('MMMM');\n t.timestamp_day = moment(t.CreatedAt).format('DD');\n t.timestamp_time = moment(t.CreatedAt).format('HH:mm');\n t.timestamp_year = moment(t.CreatedAt).format('YYYY');\n t.SwapStatusName = await getSwapStatusById(t.SwapStatusId);\n }\n \n this.loadingDCA = false;\n return this.sortByStartDate(tradesHistory);\n }\n\n async loadDcaData(dcaId) {\n let dcaDetail = await getSwapDCADetail(dcaId);\n dcaDetail.SwapRequestDCA.LastOrderDateTime = dcaDetail.SwapRequestDCA.CreatedAt;\n\n if (dcaDetail.SwapRequests){\n let i = 0;\n\n for (let t of dcaDetail.SwapRequests) {\n if (i == 0)\n dcaDetail.SwapRequestDCA.LastOrderDateTime = t.CreatedAt;\n\n t.timestamp_month_name = moment(t.CreatedAt).format('MMMM');\n t.timestamp_day = moment(t.CreatedAt).format('DD');\n t.timestamp_time = moment(t.CreatedAt).format('HH:mm');\n t.timestamp_year = moment(t.CreatedAt).format('YYYY');\n t.SwapStatusName = await getSwapStatusById(t.SwapStatusId);\n\n i++;\n } \n }\n\n if (dcaDetail.DCARefunds) {\n for (let t of dcaDetail.DCARefunds) {\n t.timestamp_month_name = moment(t.CreatedAt).format('MMMM');\n t.timestamp_day = moment(t.CreatedAt).format('DD');\n t.timestamp_time = moment(t.CreatedAt).format('HH:mm');\n t.timestamp_year = moment(t.CreatedAt).format('YYYY');\n t.SwapStatusName = await getSwapStatusById(t.SwapStatusId);\n } \n }\n this.dcaDetail = dcaDetail; \n\n this.timeUntilNextOrder = getNextOrderDateTime(this.dcaDetail);\n \n this.activateDcaButton('details'+dcaId);\n }\n\n viewSwapDetails(trade) {\n this.dialogService.open({ viewModel: DswapSwapdetailsModal, model: trade }).whenClosed(response => {\n console.log(response);\n });\n }\n\n activateDcaButton(button) {\n $(\".btn-dca\").removeClass(\"active\");\n $(\"#btn-dca-\"+button).addClass(\"active\");\n }\n\n dcaCancel(trade) {\n this.dialogService.open({ viewModel: DswapOrderDcaCancelModal, model: trade }).whenClosed(response => {\n console.log(response);\n if (!response.wasCancelled) {\n this.loadDCARequests();\n }\n });\n }\n\n async loadDcaActive() {\n this.dcaTradesActive = await this.getActiveDCARequests();\n }\n\n async loadDcaHistory() {\n this.dcaTradesHistory = await this.getHistoricalDCARequests();\n }\n\n async loadDCARequests(){\n this.dcaTradesActive = await this.getActiveDCARequests();\n this.dcaTradesHistory = await this.getHistoricalDCARequests();\n }\n\n async refreshMyBalances(){\n this.loading = true;\n await this.ts.getDSwapTokenBalances(Chain.Hive, true);\n this.loading = false;\n }\n\n private getTime(date?: Date) {\n return date != null ? new Date(date).getTime() : 0;\n }\n \n public sortByStartDate(array: ISwapRequestDCAViewModel[]): ISwapRequestDCAViewModel[] {\n return array.sort((a: ISwapRequestDCAViewModel, b: ISwapRequestDCAViewModel) => {\n let aDate:Date = moment(a.CreatedAt,\"YYYY-MM-DD HH:mm\").toDate();//.format(\"YYYY-MM-DD HH:mm\");\n let bDate:Date = moment(b.CreatedAt,\"YYYY-MM-DD HH:mm\").toDate();//.format(\"YYYY-MM-DD HH:mm\");\n return this.getTime(bDate) - this.getTime(aDate);\n });\n }\n\n private createValidationRules() {\n const rules = ValidationRules\n .ensure('buyTokenSymbol')\n .required()\n .withMessageKey('errors:dashboardBuyTokenSymbolRequired')\n .ensure('sellTokenSymbol')\n .required()\n .withMessageKey('errors:dashboardSellTokenSymbolRequired') \n .ensure('sellTokenAmount')\n .required()\n .withMessageKey(\"errors:dashboardSellTokenAmountRequired\")\n .then()\n .ensure('sellTokenAmount').satisfies((value: any, object: any) => parseFloat(value) > 0)\n .withMessageKey('errors:dashboardAmountMustBeGreaterThanZero')\n .ensure('dcaRecurrenceTypeAmount')\n .required()\n .withMessageKey(\"errors:dcaRecurrenceTypeAmountRequired\")\n .then()\n .ensure('dcaRecurrenceTypeAmount').satisfies((value: any, object: any) => { \n if (parseFloat(value) > 0) \n return true; \n\n return false;\n })\n .withMessageKey('errors:dcaRecurrenceTypeAmountRanges') \n .ensure('dcaOrderNo')\n .required()\n .withMessageKey(\"errors:dcaOrderNoRequired\")\n .then()\n .ensure('dcaOrderNo').satisfies((value: any, object: any) => {\n if (parseFloat(value) >= 2 && parseFloat(value) <= 20){\n return true;\n }\n\n return false;\n }).withMessageKey('errors:dcaOrderNoRanges').then() \n .satisfies((value: any, object: any) => {\n if (this.sellToken.isCrypto || parseFloat(this.sellTokenAmount) <= this.sellToken.userBalance.balance){ \n return true;\n }\n\n return false;\n }).withMessageKey('errors:dashboardInsufficientBalance')\n .then()\n .satisfies((value: any, object: any) => {\n if(parseFloat(this.sellToken.metrics.lastPriceUsd) * this.sellTokenAmount >= 1) {\n return true;\n };\n\n return false;\n }).withMessageKey('errors:dcaMinimumOrderValueUsd')\n .rules;\n\n this.validationController.addObject(this, rules);\n }\n}\n\n\n"],"sourceRoot":""}