func: function calculateRingFees(
          TokenTransferDelegate delegate,
          uint            ringSize,
          OrderState[]    orders,
          address         _lrcTokenAddress
          )
          private
          view
      {
          bool checkedMinerLrcSpendable = false;
          uint minerLrcSpendable = 0;
          uint8 _marginSplitPercentageBase = MARGIN_SPLIT_PERCENTAGE_BASE;
          uint nextFillAmountS;
          for (uint i = 0; i < ringSize; i++) {
              OrderState memory state = orders[i];
              uint lrcReceiable = 0;
              if (state.lrcFeeState == 0) {
                  
                  
                  state.marginSplitAsFee = true;
                  state.marginSplitPercentage = _marginSplitPercentageBase;
              } else {
                  uint lrcSpendable = getSpendable(
                      delegate,
                      _lrcTokenAddress,
                      state.owner
                  );
                  
                  
                  if (state.tokenS == _lrcTokenAddress) {
                      lrcSpendable = lrcSpendable.sub(state.fillAmountS);
                  }
                  
                  if (state.tokenB == _lrcTokenAddress) {
                      nextFillAmountS = orders[(i + 1) % ringSize].fillAmountS;
                      lrcReceiable = nextFillAmountS;
                  }
                  uint lrcTotal = lrcSpendable.add(lrcReceiable);
                  
                  if (lrcTotal < state.lrcFeeState) {
                      state.lrcFeeState = lrcTotal;
                      state.marginSplitPercentage = _marginSplitPercentageBase;
                  }
                  if (state.lrcFeeState == 0) {
                      state.marginSplitAsFee = true;
                  }
              }
              if (!state.marginSplitAsFee) {
                  if (lrcReceiable > 0) {
                      if (lrcReceiable >= state.lrcFeeState) {
                          state.splitB = state.lrcFeeState;
                          state.lrcFeeState = 0;
                      } else {
                          state.splitB = lrcReceiable;
                          state.lrcFeeState = state.lrcFeeState.sub(lrcReceiable);
                      }
                  }
              } else {
                  
                  if (!checkedMinerLrcSpendable && minerLrcSpendable < state.lrcFeeState) {
                      checkedMinerLrcSpendable = true;
                      minerLrcSpendable = getSpendable(delegate, _lrcTokenAddress, tx.origin);
                  }
                  
                  
                  if (minerLrcSpendable >= state.lrcFeeState) {
                      nextFillAmountS = orders[(i + 1) % ringSize].fillAmountS;
                      uint split;
                      if (state.buyNoMoreThanAmountB) {
                          split = (nextFillAmountS.mul(
                              state.amountS
                          ) / state.amountB).sub(
                              state.fillAmountS
                          );
                      } else {
                          split = nextFillAmountS.sub(
                              state.fillAmountS.mul(
                                  state.amountB
                              ) / state.amountS
                          );
                      }
                      if (state.marginSplitPercentage != _marginSplitPercentageBase) {
                          split = split.mul(
                              state.marginSplitPercentage
                          ) / _marginSplitPercentageBase;
                      }
                      if (state.buyNoMoreThanAmountB) {
                          state.splitS = split;
                      } else {
                          state.splitB = split;
                      }
                      
                      
                      
                      if (split > 0) {
                          minerLrcSpendable = minerLrcSpendable.sub(state.lrcFeeState);
                          state.lrcReward = state.lrcFeeState;
                      }
                  }
                  state.lrcFeeState = 0;
              }
          }
      }