diff --git a/i18n/ar.json b/i18n/ar.json index 613f9aaf83416220cdb54eaf8bc7784d5625b05b..9286180319ef196c9728fb306bb9c81ced500473 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -964,5 +964,7 @@ "modal.noHistory": "لا يوجد سجل متاح.", "modal.error": "خطأ في تحميل سجل الرصيد.", "modal.close": "إغلاق", - "export.topHolders": "كبار_الحائزين" + "export.topHolders": "كبار_الحائزين", + "formatter.formatLimitOrderCreateOperation.avgRatePrefix": "بمعدل متوسط قدره", + "formatter.formatFillOrderOperation.avgRatePrefix": "بمعدل متوسط قدره" } \ No newline at end of file diff --git a/i18n/de.json b/i18n/de.json index 717bb5ce9d3de83e9dcb32205da8703323a49d90..c99cc01930b975545b383a663f6e17ab54c5e81b 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -964,5 +964,7 @@ "modal.noHistory": "Keine Historie verfügbar.", "modal.error": "Fehler beim Laden der Guthabenhistorie.", "modal.close": "Schließen", - "export.topHolders": "top_inhaber" + "export.topHolders": "top_inhaber", + "formatter.formatLimitOrderCreateOperation.avgRatePrefix": "zu einem durchschnittlichen Kurs von", + "formatter.formatFillOrderOperation.avgRatePrefix": "zu einem durchschnittlichen Kurs von" } \ No newline at end of file diff --git a/i18n/en.json b/i18n/en.json index 2e8f8409a2db09f02cffac53707b074e9d5f2896..9c4cdf44f2802c5081c3f845245eecf2cbad60d6 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -964,6 +964,8 @@ "modal.noHistory": "No history available.", "modal.error": "Error loading balance history.", "modal.close": "Close", - "export.topHolders": "top_holders" + "export.topHolders": "top_holders", + "formatter.formatLimitOrderCreateOperation.avgRatePrefix": "at an avg rate of", + "formatter.formatFillOrderOperation.avgRatePrefix": "at an avg rate of" } \ No newline at end of file diff --git a/i18n/es.json b/i18n/es.json index 81dcc2032d004fe1af6c3cd57d317400a00ff232..558f041f5b15ad4c062741c4c87dc2cdd496abf1 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -963,7 +963,9 @@ "modal.noHistory": "No hay historial disponible.", "modal.error": "Error al cargar el historial de saldo.", "modal.close": "Cerrar", - "export.topHolders": "top_holders" + "export.topHolders": "top_holders", + "formatter.formatLimitOrderCreateOperation.avgRatePrefix": "a una tasa promedio de", + "formatter.formatFillOrderOperation.avgRatePrefix": "a una tasa promedio de" } \ No newline at end of file diff --git a/i18n/fr.json b/i18n/fr.json index 21e919a8a75938bf26b73d514189afdad66921fe..6978fe0d02404f1ed93ab8bb228d69640f1401cf 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -964,5 +964,7 @@ "modal.noHistory": "Aucun historique disponible.", "modal.error": "Erreur lors du chargement de l'historique du solde.", "modal.close": "Fermer", - "export.topHolders": "principaux_detenteurs" + "export.topHolders": "principaux_detenteurs", + "formatter.formatLimitOrderCreateOperation.avgRatePrefix": "à un taux moyen de", + "formatter.formatFillOrderOperation.avgRatePrefix": "à un taux moyen de" } \ No newline at end of file diff --git a/i18n/it.json b/i18n/it.json index 9348c15617be69837e154420753174a94d649012..ad61eee657268b93709d123079cb0d348ee6d71d 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -959,5 +959,7 @@ "modal.noHistory": "Nessuna cronologia disponibile.", "modal.error": "Errore nel caricamento della cronologia del saldo.", "modal.close": "Chiudi", - "export.topHolders": "principali_detentori" + "export.topHolders": "principali_detentori", + "formatter.formatLimitOrderCreateOperation.avgRatePrefix": "a un tasso medio di", + "formatter.formatFillOrderOperation.avgRatePrefix": "a un tasso medio di" } \ No newline at end of file diff --git a/i18n/ja.json b/i18n/ja.json index 32bca853a8cb1e796344e47ef97f576e64def676..ff11e3027f61f316a0df1a4fd311cd441762cd43 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -964,5 +964,7 @@ "modal.noHistory": "履歴はありません。", "modal.error": "残高履歴の読み込み中にエラーが発生しました。", "modal.close": "閉じる", - "export.topHolders": "主要保有者" + "export.topHolders": "主要保有者", + "formatter.formatLimitOrderCreateOperation.avgRatePrefix": "平均レートで", + "formatter.formatFillOrderOperation.avgRatePrefix":"平均レートで" } \ No newline at end of file diff --git a/i18n/pl.json b/i18n/pl.json index 9ebb72b41bf0d1b7eb44bd5b84476f6dd0e2b235..a62229e3153d04d7a83a88bbd3fcd72c05743cfe 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -964,5 +964,7 @@ "modal.noHistory": "Brak dostępnej historii.", "modal.error": "Błąd ładowania historii salda.", "modal.close": "Zamknij", - "export.topHolders": "najwięksi_posiadacze" + "export.topHolders": "najwięksi_posiadacze", + "formatter.formatLimitOrderCreateOperation.avgRatePrefix": "po średnim kursie", + "formatter.formatFillOrderOperation.avgRatePrefix": "po średnim kursie" } \ No newline at end of file diff --git a/i18n/pt.json b/i18n/pt.json index 5b814c2e2831d1521285354067c954981f336ab9..e65ae4684411fac8412ac2b046075e3720a3033e 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -964,5 +964,7 @@ "modal.noHistory": "Nenhum histórico disponível.", "modal.error": "Erro ao carregar histórico de saldo.", "modal.close": "Fechar", - "export.topHolders": "principais_detentores" + "export.topHolders": "principais_detentores", + "formatter.formatLimitOrderCreateOperation.avgRatePrefix": "a uma taxa média de", + "formatter.formatFillOrderOperation.avgRatePrefix": "a uma taxa média de" } \ No newline at end of file diff --git a/i18n/ro.json b/i18n/ro.json index 7f68ad8843d6deda376400db5657c8b6a523bd0e..bff61e204b4ca032ce974dd93b4d9ffbbe041c85 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -963,5 +963,7 @@ "modal.noHistory": "Nu există istoric disponibil.", "modal.error": "Eroare la încărcarea istoricului soldului.", "modal.close": "Închide", - "export.topHolders": "detinatori_principali" + "export.topHolders": "detinatori_principali", + "formatter.formatLimitOrderCreateOperation.avgRatePrefix": "la o rată medie de", + "formatter.formatFillOrderOperation.avgRatePrefix": "la o rată medie de" } \ No newline at end of file diff --git a/i18n/zh.json b/i18n/zh.json index 612615adfd973c61db7feb8ce5b6752047c13b03..3e37aaf16358a83a3521a5b91c9fed13683bc769 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -964,5 +964,7 @@ "modal.noHistory": "没有可用记录。", "modal.error": "加载余额历史出错。", "modal.close": "关闭", - "export.topHolders": "主要持有人" + "export.topHolders": "主要持有人", + "formatter.formatLimitOrderCreateOperation.avgRatePrefix": "以平均汇率", + "formatter.formatFillOrderOperation.avgRatePrefix":"以平均汇率" } \ No newline at end of file diff --git a/lib/Formatter.tsx b/lib/Formatter.tsx index c6f7afe32b9a8786680865571ef4db1a6a765d7c..3592533faaecf1a145b2a19b838ce129c50a41d4 100644 --- a/lib/Formatter.tsx +++ b/lib/Formatter.tsx @@ -122,6 +122,39 @@ class OperationsFormatter implements IWaxCustomFormatter { return formattedValue; } +private getAverageRate( + a: { amount: string; precision: number } | undefined, + b: { amount: string; precision: number } | undefined +): string { + if (!a || !b) return ""; + + const parse = (s: { amount: string; precision: number }) => + parseFloat(s.amount) / Math.pow(10, s.precision); + + const valA = parse(a); + const valB = parse(b); + + if (valA <= 0 || valB <= 0) return ""; + + const symA = String(this.wax.formatter.format(a)).toUpperCase(); + const symB = String(this.wax.formatter.format(b)).toUpperCase(); + + let hiveVal: number | undefined; + let hbdVal: number | undefined; + + if (symA.includes("HIVE")) hiveVal = valA; + if (symA.includes("HBD")) hbdVal = valA; + + if (symB.includes("HIVE")) hiveVal = valB; + if (symB.includes("HBD")) hbdVal = valB; + + if (!hiveVal || !hbdVal) return ""; + + const price = hbdVal / hiveVal; + return `${price.toFixed(3)} HBD/HIVE`; +} + + private getFormattedDate(time: Date | string): string { return formatAndDelocalizeTime(time); @@ -520,25 +553,34 @@ class OperationsFormatter implements IWaxCustomFormatter { source: { value: op }, target, }: IFormatFunctionArguments<{ value: limit_order_create }>) { - const message = this.generateReactLink([ + const avgRate = this.getAverageRate(op.amount_to_sell, op.min_to_receive); + + const messageElements: Array = [ this.getAccountLink(op.owner), this.i18n.t("formatter.formatLimitOrderCreateOperation.actionSell"), this.getFormattedAmount(op.amount_to_sell), - this.i18n.t( - "formatter.formatLimitOrderCreateOperation.conditionMinReceive" - ), + this.i18n.t("formatter.formatLimitOrderCreateOperation.conditionMinReceive"), this.getFormattedAmount(op.min_to_receive), this.i18n.t("formatter.formatLimitOrderCreateOperation.idPrefix"), `${op.orderid}`, - ...(!op.fill_or_kill - ? [ - this.i18n.t( - "formatter.formatLimitOrderCreateOperation.expirationPrefix" - ), - this.getFormattedDate(op.expiration), - ] - : []), - ]); + ]; + + + if (avgRate) { + messageElements.push( + this.i18n.t("formatter.formatLimitOrderCreateOperation.avgRatePrefix"), + avgRate + ); + } + + if (!op.fill_or_kill) { + messageElements.push( + this.i18n.t("formatter.formatLimitOrderCreateOperation.expirationPrefix"), + this.getFormattedDate(op.expiration) + ); + } + + const message = this.generateReactLink(messageElements); return { ...target, @@ -1989,7 +2031,8 @@ class OperationsFormatter implements IWaxCustomFormatter { source: { value: op }, target, }: IFormatFunctionArguments<{ value: fill_order }>) { - const message = this.generateReactLink([ + const avgRate = this.getAverageRate(op.current_pays, op.open_pays); + const messageElements: Array = [ this.getAccountLink(op.current_owner), this.i18n.t("formatter.formatFillOrderOperation.actionPaid"), this.getFormattedAmount(op.current_pays), @@ -2001,7 +2044,16 @@ class OperationsFormatter implements IWaxCustomFormatter { `${op.current_orderid}`, this.i18n.t("formatter.formatFillOrderOperation.arrowSeparator"), `${op.open_orderid})`, - ]); + ]; + if (avgRate) { + messageElements.push( + this.i18n.t("formatter.formatFillOrderOperation.avgRatePrefix"), + avgRate + ); + } + + const message = this.generateReactLink(messageElements); + return { ...target, value: { ...message, ...this.getOperationPerspective(op.current_owner) },