1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-02-23 21:02:23 +00:00

nem2: Refactor for new bn_format

This commit is contained in:
Saleem Rashid 2017-07-26 19:25:46 +01:00
parent 2aeeb3f978
commit 1f20625bbc
3 changed files with 48 additions and 94 deletions

View File

@ -611,17 +611,10 @@ void layoutNEMLevy(const NEMMosaicDefinition *definition, uint8_t network) {
} }
char str_out[32]; char str_out[32];
bignum256 amnt;
switch (definition->levy) { switch (definition->levy) {
case NEMMosaicLevy_MosaicLevy_Percentile: case NEMMosaicLevy_MosaicLevy_Percentile:
bn_read_uint64(definition->fee, &amnt); bn_format_uint64(definition->fee, NULL, NULL, 0, 0, false, str_out, sizeof(str_out));
bn_format(&amnt, NULL, NULL, 0, str_out, sizeof(str_out));
char *decimal = strchr(str_out, '.');
if (decimal != NULL) {
*decimal = '\0';
}
layoutDialogSwipe(&bmp_icon_question, layoutDialogSwipe(&bmp_icon_question,
_("Cancel"), _("Cancel"),

View File

@ -27,8 +27,6 @@
#include "rng.h" #include "rng.h"
#include "secp256k1.h" #include "secp256k1.h"
static void format_amount(const NEMMosaicDefinition *definition, uint64_t quantity, const bignum256 *multiplier, const bignum256 *multiplier2, int divisor, char *str_out, size_t size);
const char *nem_validate_common(NEMTransactionCommon *common, bool inner) { const char *nem_validate_common(NEMTransactionCommon *common, bool inner) {
if (!common->has_network) { if (!common->has_network) {
common->has_network = true; common->has_network = true;
@ -395,20 +393,15 @@ bool nem_askMosaicCreation(const NEMTransactionCommon *common, const NEMMosaicCr
} }
char str_out[32]; char str_out[32];
bignum256 amnt;
bn_read_uint64(mosaic_creation->definition.supply, &amnt); bn_format_uint64(mosaic_creation->definition.supply,
bn_format(&amnt, NULL, NULL, 0, str_out, sizeof(str_out)); NULL,
NULL,
char *decimal = strchr(str_out, '.'); mosaic_creation->definition.divisibility,
if (decimal != NULL) { mosaic_creation->definition.divisibility,
*decimal = '\0'; true,
} str_out,
sizeof(str_out));
strlcat(str_out, ".", sizeof(str_out));
for (size_t i = 0; i < mosaic_creation->definition.divisibility; i++) {
strlcat(str_out, "0", sizeof(str_out));
}
layoutDialogSwipe(&bmp_icon_question, layoutDialogSwipe(&bmp_icon_question,
_("Cancel"), _("Cancel"),
@ -502,15 +495,7 @@ bool nem_askSupplyChange(const NEMTransactionCommon *common, const NEMMosaicSupp
} }
char str_out[32]; char str_out[32];
bn_format_uint64(supply_change->delta, NULL, NULL, 0, 0, false, str_out, sizeof(str_out));
bignum256 amnt;
bn_read_uint64(supply_change->delta, &amnt);
bn_format(&amnt, NULL, NULL, 0, str_out, sizeof(str_out));
char *decimal = strchr(str_out, '.');
if (decimal != NULL) {
*decimal = '\0';
}
layoutDialogSwipe(&bmp_icon_question, layoutDialogSwipe(&bmp_icon_question,
_("Cancel"), _("Cancel"),
@ -584,15 +569,14 @@ bool nem_askAggregateModification(const NEMTransactionCommon *common, const NEMA
int32_t relative_change = aggregate_modification->relative_change; int32_t relative_change = aggregate_modification->relative_change;
if (relative_change) { if (relative_change) {
char str_out[32]; char str_out[32];
bn_format_uint64(relative_change < 0 ? -relative_change : relative_change,
bignum256 amnt; NULL,
bn_read_uint64(relative_change < 0 ? -relative_change : relative_change, &amnt); NULL,
bn_format(&amnt, NULL, NULL, 0, str_out, sizeof(str_out)); 0,
0,
char *decimal = strchr(str_out, '.'); false,
if (decimal != NULL) { str_out,
*decimal = '\0'; sizeof(str_out));
}
layoutDialogSwipe(&bmp_icon_question, layoutDialogSwipe(&bmp_icon_question,
_("Cancel"), _("Cancel"),
@ -704,80 +688,52 @@ const NEMMosaicDefinition *nem_mosaicByName(const char *namespace, const char *m
return NULL; return NULL;
} }
void format_amount(const NEMMosaicDefinition *definition, uint64_t quantity, const bignum256 *multiplier, const bignum256 *multiplier2, int divisor, char *str_out, size_t size) { static inline size_t format_amount(const NEMMosaicDefinition *definition, const bignum256 *amnt, const bignum256 *multiplier, int divisor, char *str_out, size_t size) {
uint32_t divisibility = definition && definition->has_divisibility ? definition->divisibility : 0; bignum256 val;
const char *ticker = definition && definition->has_ticker ? definition->ticker : NULL; memcpy(&val, amnt, sizeof(bignum256));
bignum256 amnt;
bn_read_uint64(quantity, &amnt);
if (multiplier2) {
bn_multiply(multiplier2, &amnt, &secp256k1.prime);
}
// Do not use prefix/suffix with bn_format, it messes with the truncation code
if (multiplier) { if (multiplier) {
bn_multiply(multiplier, &amnt, &secp256k1.prime); bn_multiply(multiplier, &val, &secp256k1.prime);
divisor += NEM_MOSAIC_DEFINITION_XEM->divisibility; divisor += NEM_MOSAIC_DEFINITION_XEM->divisibility;
} }
// bn_format(amnt / (10 ^ divisor), divisibility) return bn_format(&val,
bn_format(&amnt, NULL, NULL, divisibility + divisor, str_out, size); NULL,
definition && definition->has_ticker ? definition->ticker : NULL,
// Truncate as if we called bn_format with (divisibility) instead of (divisibility + divisor) definition && definition->has_divisibility ? definition->divisibility : 0,
char *decimal = strchr(str_out, '.'); -divisor,
if (decimal != NULL) { false,
const char *terminator = strchr(str_out, '\0'); str_out,
size);
if (divisibility == 0) {
// Truncate as an integer
*decimal = '\0';
} else {
char *end = decimal + divisibility + 1;
if (end < terminator) {
*end = '\0';
}
}
}
if (ticker) {
strlcat(str_out, " ", size);
strlcat(str_out, ticker, size);
}
} }
void nem_mosaicFormatAmount(const NEMMosaicDefinition *definition, uint64_t quantity, const bignum256 *multiplier, char *str_out, size_t size) { void nem_mosaicFormatAmount(const NEMMosaicDefinition *definition, uint64_t quantity, const bignum256 *multiplier, char *str_out, size_t size) {
format_amount(definition, quantity, multiplier, NULL, 0, str_out, size); bignum256 amnt;
bn_read_uint64(quantity, &amnt);
format_amount(definition, &amnt, multiplier, 0, str_out, size);
} }
bool nem_mosaicFormatLevy(const NEMMosaicDefinition *definition, uint64_t quantity, const bignum256 *multiplier, uint8_t network, char *str_out, size_t size) { bool nem_mosaicFormatLevy(const NEMMosaicDefinition *definition, uint64_t quantity, const bignum256 *multiplier, uint8_t network, char *str_out, size_t size) {
bignum256 multiplier2;
if (!definition->has_levy || !definition->has_fee) { if (!definition->has_levy || !definition->has_fee) {
return false; return false;
} }
const NEMMosaicDefinition *levy_mosaic = nem_mosaicByName(definition->levy_namespace, definition->levy_mosaic, network); bignum256 amnt, fee;
bn_read_uint64(quantity, &amnt);
bn_read_uint64(definition->fee, &fee);
const NEMMosaicDefinition *mosaic = nem_mosaicByName(definition->levy_namespace, definition->levy_mosaic, network);
switch (definition->levy) { switch (definition->levy) {
case NEMMosaicLevy_MosaicLevy_Absolute: case NEMMosaicLevy_MosaicLevy_Absolute:
format_amount(levy_mosaic, definition->fee, NULL, NULL, 0, str_out, size); return format_amount(mosaic, &fee, NULL, 0, str_out, size);
break;
case NEMMosaicLevy_MosaicLevy_Percentile: case NEMMosaicLevy_MosaicLevy_Percentile:
bn_read_uint64(definition->fee, &multiplier2); bn_multiply(&fee, &amnt, &secp256k1.prime);
format_amount(levy_mosaic, quantity, multiplier, &multiplier2, NEM_LEVY_PERCENTILE_DIVISOR, str_out, size); return format_amount(mosaic, &amnt, multiplier, NEM_LEVY_PERCENTILE_DIVISOR, str_out, size);
break;
default: default:
return false; return false;
} }
return true;
}
void nem_mosaicFormatName(const char *namespace, const char *mosaic, char *str_out, size_t size) {
strlcpy(str_out, namespace, size);
strlcat(str_out, ".", size);
strlcat(str_out, mosaic, size);
} }

View File

@ -57,7 +57,12 @@ const NEMMosaicDefinition *nem_mosaicByName(const char *namespace, const char *m
void nem_mosaicFormatAmount(const NEMMosaicDefinition *definition, uint64_t quantity, const bignum256 *multiplier, char *str_out, size_t size); void nem_mosaicFormatAmount(const NEMMosaicDefinition *definition, uint64_t quantity, const bignum256 *multiplier, char *str_out, size_t size);
bool nem_mosaicFormatLevy(const NEMMosaicDefinition *definition, uint64_t quantity, const bignum256 *multiplier, uint8_t network, char *str_out, size_t size); bool nem_mosaicFormatLevy(const NEMMosaicDefinition *definition, uint64_t quantity, const bignum256 *multiplier, uint8_t network, char *str_out, size_t size);
void nem_mosaicFormatName(const char *namespace, const char *mosaic, char *str_out, size_t size);
static inline void nem_mosaicFormatName(const char *namespace, const char *mosaic, char *str_out, size_t size) {
strlcpy(str_out, namespace, size);
strlcat(str_out, ".", size);
strlcat(str_out, mosaic, size);
}
static inline bool nem_mosaicMatches(const NEMMosaicDefinition *definition, const char *namespace, const char *mosaic, uint8_t network) { static inline bool nem_mosaicMatches(const NEMMosaicDefinition *definition, const char *namespace, const char *mosaic, uint8_t network) {
if (strcmp(namespace, definition->namespace) == 0 && strcmp(mosaic, definition->mosaic) == 0) { if (strcmp(namespace, definition->namespace) == 0 && strcmp(mosaic, definition->mosaic) == 0) {