diff --git a/i18n/ar.json b/i18n/ar.json index 140893e8a803ae95c9b3492d48b758c603e37d70..0755fd5cc32c8339ca29d59d122a39e708102be9 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -952,5 +952,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 bf9ffe06cd62ba1111e71d64d2927cc6e950d0c2..25c5df11edbe390a915127d964ec2cad83fee21d 100644 --- a/i18n/de.json +++ b/i18n/de.json @@ -952,5 +952,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 e6ceb52246fd35cb5de3a76539fdc460cf2a024f..c469f814cc09f86df69699537d27b0cc2ced1d4e 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -952,5 +952,7 @@ "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 779f8f88e4ed3242fe9cfe54e9619020bb5c8a32..d81428e384e78f89cfbe4a8405ef3109108b2a6f 100644 --- a/i18n/es.json +++ b/i18n/es.json @@ -951,5 +951,8 @@ "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 547b41178b8a6d635094927fdfaf906e096251e6..8c23880e82b23c975838edc8bcf9327a6d7b7eba 100644 --- a/i18n/fr.json +++ b/i18n/fr.json @@ -952,5 +952,8 @@ "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 b03dae15319c350c547f23b46f56701d8b73bfe9..50363eae754be4bfbb0a47729cf8cff301fa1c95 100644 --- a/i18n/it.json +++ b/i18n/it.json @@ -947,6 +947,9 @@ "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 ff78982c0ef218287ee7f2a64fd495faa5a374f3..7690638b9d3ddaeac5c110fc52ee83d1f771f8b3 100644 --- a/i18n/ja.json +++ b/i18n/ja.json @@ -952,5 +952,8 @@ "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 89b9f8400c4a3cbca69b1de5dbe1b12b226eb193..89b5cc1757f288a9e3b2204e2dc9bcaddade7160 100644 --- a/i18n/pl.json +++ b/i18n/pl.json @@ -952,5 +952,8 @@ "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 986b37315f4d2c954f88f5b374cc559614b3eb43..93958816874fd75a22ef0022e86d1401d89708c9 100644 --- a/i18n/pt.json +++ b/i18n/pt.json @@ -952,5 +952,8 @@ "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 79f4ebde2d2684d09677605cfc61b836e9007ecc..5ad4cc04423b3181a94b302295a5fe5be2c08b11 100644 --- a/i18n/ro.json +++ b/i18n/ro.json @@ -951,5 +951,8 @@ "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 27863a19bde3005442cec5462c20d3e199b0d515..8ad41b17d230d3ad621f60d6be149ab0d84f3c7e 100644 --- a/i18n/zh.json +++ b/i18n/zh.json @@ -952,5 +952,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..0f8f0314b731fb8d6abf73cb4f224a00b268e2b1 100644 --- a/lib/Formatter.tsx +++ b/lib/Formatter.tsx @@ -122,6 +122,24 @@ class OperationsFormatter implements IWaxCustomFormatter { return formattedValue; } +private getAverageRate( + hive: { amount: string; precision: number } | undefined, + hbd: { amount: string; precision: number } | undefined +): string { + if (!hive || !hbd) return ""; + + const parse = (s: { amount: string; precision: number }) => + parseFloat(s.amount) / Math.pow(10, s.precision); + + const hiveVal = parse(hive); + const hbdVal = parse(hbd); + + if (!hbdVal) return ""; // Avoid division by zero + + // The output should be like "0.19 HIVE/HBD" + return `${(hiveVal / hbdVal).toFixed(3)} HIVE/HBD`; +} + private getFormattedDate(time: Date | string): string { return formatAndDelocalizeTime(time); @@ -520,25 +538,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 +2016,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 +2029,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.atAvgRatePrefix"), + avgRate + ); + } + + const message = this.generateReactLink(messageElements); + return { ...target, value: { ...message, ...this.getOperationPerspective(op.current_owner) },