private void WriteMosaicBytes(MosaicList mosaicList)
        {
            // write mosaic bytes to byte array
            _serializer.WriteBytes(mosaicList.GetMosaicListBytes());

            // store mosaic bytes length
            MosaicLength = mosaicList.GetMosaicListBytes().Length - 4;
        }
        private void SerializeTransferPart()
        {
            // declare and serialize message if not null
            Message serializedMessage = null;

            if (Data.Message != null)
            {
                serializedMessage = SerializeMessagePart();
            }

            // declare and serialize mosaics if not null
            MosaicList serializedMosaicList = null;

            if (Data.ListOfMosaics != null)
            {
                serializedMosaicList = SerializeMosaicPart();
            }

            // get the fee for transfer amount
            var transferFee = Math.Max(1, Math.Min((long)Math.Ceiling((decimal)Data.Amount / 10000000000), 25)) * 1000000;

            // get the fee for message part, 0 if its null
            var messageFee = serializedMessage?.GetFee() ?? 0;


            // get the fee for mosaic part, 0 if null
            var mosaicFee = serializedMosaicList?.GetFee() ?? 0;

            // if fee is to be deducted from amount, calculate accordingly
            if (Data.FeeDeductedFromAmount)
            {
                // minus total fees from original amount.
                long newAmount;

                long newFee;

                do
                {
                    newAmount = Data.Amount - (messageFee + mosaicFee + transferFee);

                    // calculate new fee based on new fee deducted amount
                    newFee = Math.Max(1, Math.Min((long)Math.Ceiling((decimal)newAmount / 10000000000), 25)) * 1000000;

                    // check that the fee hasnt been reduced due to a lower amount
                    if (newAmount + newFee != Data.Amount)
                    {
                        // increase amount to compensate if it has
                        newAmount += 1000000;
                    }
                    // check that
                } while (newAmount + newFee != Data.Amount);

                // reset the amount to new fee adjusted amount
                Data.Amount = newAmount;

                // add new transfer fee to total amount
                Fee += newFee + messageFee + mosaicFee;
            }
            else
            {
                // if fee is not to be deducted, add individual fees to total fee without adjustment
                Fee += transferFee + messageFee + mosaicFee;
            }

            // write the transfer bytes
            WriteTransferBytes();

            // write message bytes if they are not null.
            if (serializedMessage != null)
            {
                WriteMessageBytes(serializedMessage);
            }
            else
            {
                _serializer.WriteInt(ByteLength.Zero);
            }

            // write mosaic bytes if they are not null.
            if (serializedMosaicList != null)
            {
                WriteMosaicBytes(serializedMosaicList);
            }
            else
            {
                _serializer.WriteInt(ByteLength.Zero);
            }
        }