text: // Copyright (c) 2009-2018 Satoshi Nakamoto
  // Copyright (c) 2009-2018 The Bitcoin Developers
  // Copyright (c) 2016-2018 Duality Blockchain Solutions Developers
  // Distributed under the MIT software license, see the accompanying
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  
  #include "amount.h"
  
  #include "primitives/block.h"
  #include "consensus/consensus.h"
  #include "tinyformat.h"
  
  const std::string CURRENCY_UNIT = "SEQ";
  
  CFeeRate::CFeeRate(const CAmount& nFeePaid, size_t nBytes_)
  {
      assert(nBytes_ <= uint64_t(std::numeric_limits<int64_t>::max()));
      int64_t nSize = int64_t(nBytes_);
  
      if (nSize > 0)
          nSatoshisPerK = nFeePaid * 1000 / nSize;
      else
          nSatoshisPerK = 0;
  }
  
  CAmount CFeeRate::GetFee(size_t nBytes_) const
  {
      assert(nBytes_ <= uint64_t(std::numeric_limits<int64_t>::max()));
      int64_t nSize = int64_t(nBytes_);
  
      CAmount nFee = nSatoshisPerK * nSize / 1000;
  
      if (nFee == 0 && nSize != 0) {
          if (nSatoshisPerK > 0)
              nFee = CAmount(1);
          if (nSatoshisPerK < 0)
              nFee = CAmount(-1);
      }
  
      return nFee;
  }
  
  CAmount GetMinFee(size_t nBytes, size_t nBlockSize)
  {
      // Base fee is either MIN_TX_FEE or MIN_RELAY_TX_FEE
      CAmount nBaseFee = MIN_TX_FEE;
  
      size_t nNewBlockSize = nBlockSize + nBytes;
      CAmount nMinFee = (1 + nBytes / (10 * 1024)) * nBaseFee; // 1 subcent per 10 kb of data
  
      // Raise the price as the block approaches full
      if (nBlockSize != 1 && nNewBlockSize >= MAX_BLOCK_SIZE_GEN/2)
      {
          if (nNewBlockSize >= MAX_BLOCK_SIZE_GEN)
              return MAX_MONEY;
          nMinFee *= MAX_BLOCK_SIZE_GEN / (MAX_BLOCK_SIZE_GEN - nNewBlockSize);
      }
  
      if (!MoneyRange(nMinFee))
          nMinFee = MAX_MONEY;
      return nMinFee;
  }
  
  std::string CFeeRate::ToString() const
  {
      return strprintf("%d.%08d %s/kB", nSatoshisPerK / COIN, nSatoshisPerK % COIN, CURRENCY_UNIT);
  }
  