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); } }