Предположим, вы хотите, чтобы ваш контракт EOS принимал платежи только на точную определенную сумму. Затем, конечно, вам нужно будет вывести желаемую сумму в eosio_assert(), чтобы плательщик понял, какая сумма ожидается. Но eosiolib, библиотека всех стандартных инструментов для построения контракта, не предоставляет функции, которая просто генерирует строку из объекта asset.

Вы можете попробовать использовать для этого sprintf(), но вскоре вы обнаружите, что он добавляет около 20 КБ к вашему двоичному файлу, что приводит к дополнительному использованию 200 КБ ОЗУ при загрузке контракта в сеть. В текущих ценах это примерно 200 долларов США.

Итак, я написал этот фрагмент кода, чтобы смягчить эту проблему:

if( payment != exactprice ) {
      int64_t pres = (int64_t)exactprice.symbol.precision();
      char buf[64];
      char* start = buf + sizeof(buf) - 10;
      char* end = start;
      int digits = 0;
      
      int64_t amount = exactprice.amount;
      while( amount != 0 || digits < pres+1 ) {
        --start;
        *start = (amount % 10) + '0';
        digits++;
        if( digits == pres ) {
          *--start = '.';
        }
        amount /= 10;
      }
      
      *end++ = ' ';
      auto sym = exactprice.symbol.name();
      for( int i = 0; i < 7; ++i ) {
        char c = (char)(sym & 0xff);
        *end++ = c;
        if( c == 0 ) break;
        sym >>= 8;
      }
      *end = 0;
      
      char str[256] = "Incorrect payment amount. Expected ";
      strcat(str, start);
      eosio_assert(0, str);
    }

Некоторым из вас, возможно, понравится вернуться к базовым заданиям в классе информатики :)