Search in sources :

Example 1 with MosaicMetaData

use of com.github.rosklyar.client.mosaic.domain.MosaicMetaData in project nem-library by rosklyar.

the class DefaultFeeCalculator method mosaicFee.

private long mosaicFee(MosaicTransfer mosaicTransfer, int times) {
    String namespaceId = mosaicTransfer.mosaicId.namespaceId;
    String mosaicName = mosaicTransfer.mosaicId.name;
    MosaicsMetaDataResponse mosaicsMetaDataResponse = mosaicClient.mosaics(namespaceId, null, 100);
    MosaicMetaData mosaicMetaData = mosaicsMetaDataResponse.data.stream().filter(mmd -> mmd.mosaic.id.name.equals(mosaicName)).findFirst().orElseThrow(() -> new RuntimeException(String.format("No mosaic definition with name=%s found in namespace=%s", mosaicName, namespaceId)));
    int divisibility = mosaicMetaData.mosaic.properties.stream().filter(pr -> pr.name.equals("divisibility")).findFirst().map(pr -> Integer.valueOf(pr.value)).orElseThrow(RuntimeException::new);
    OwnedMosaicsResponse ownedMosaicsResponse = accountClient.ownedMosaics(accountClient.getFromPublicKey(mosaicMetaData.mosaic.creator).account.address);
    long mosaicQuantity = ownedMosaicsResponse.data.stream().filter(ownedMosaic -> ownedMosaic.mosaicId.name.equals(mosaicName)).findFirst().map(ownedMosaic -> ownedMosaic.quantity).orElseThrow(RuntimeException::new);
    if (isSmallBusinessMosaic(divisibility, mosaicQuantity)) {
        return 1L;
    }
    long supplyRelatedAdjustment = roundToLong(0.8 * log(valueOf(maxMosaicQuantity).divide(valueOf(mosaicQuantity)).doubleValue()), DOWN);
    long xemEquivalent = roundToLong(valueOf(8999999999L * mosaicTransfer.quantity * times).divide(valueOf(mosaicQuantity)).doubleValue(), DOWN);
    long microXemEquivalent = xemEquivalent * TEN.pow(nemDivisibility).longValue();
    long xemFee = calculateXemTransferFee(microXemEquivalent);
    return max(1L, xemFee - supplyRelatedAdjustment);
}
Also used : AccountClient(com.github.rosklyar.client.account.AccountClient) DOWN(java.math.RoundingMode.DOWN) Strings.isNullOrEmpty(com.google.common.base.Strings.isNullOrEmpty) MosaicClient(com.github.rosklyar.client.mosaic.MosaicClient) MosaicMetaData(com.github.rosklyar.client.mosaic.domain.MosaicMetaData) MosaicTransfer(com.github.rosklyar.client.transaction.domain.mosaic.MosaicTransfer) BigInteger.valueOf(java.math.BigInteger.valueOf) List(java.util.List) TEN(java.math.BigInteger.TEN) MosaicsMetaDataResponse(com.github.rosklyar.client.mosaic.domain.MosaicsMetaDataResponse) Math(java.lang.Math) DoubleMath.roundToLong(com.google.common.math.DoubleMath.roundToLong) OwnedMosaicsResponse(com.github.rosklyar.client.account.domain.mosaic.OwnedMosaicsResponse) MosaicMetaData(com.github.rosklyar.client.mosaic.domain.MosaicMetaData) MosaicsMetaDataResponse(com.github.rosklyar.client.mosaic.domain.MosaicsMetaDataResponse) OwnedMosaicsResponse(com.github.rosklyar.client.account.domain.mosaic.OwnedMosaicsResponse)

Aggregations

AccountClient (com.github.rosklyar.client.account.AccountClient)1 OwnedMosaicsResponse (com.github.rosklyar.client.account.domain.mosaic.OwnedMosaicsResponse)1 MosaicClient (com.github.rosklyar.client.mosaic.MosaicClient)1 MosaicMetaData (com.github.rosklyar.client.mosaic.domain.MosaicMetaData)1 MosaicsMetaDataResponse (com.github.rosklyar.client.mosaic.domain.MosaicsMetaDataResponse)1 MosaicTransfer (com.github.rosklyar.client.transaction.domain.mosaic.MosaicTransfer)1 Strings.isNullOrEmpty (com.google.common.base.Strings.isNullOrEmpty)1 DoubleMath.roundToLong (com.google.common.math.DoubleMath.roundToLong)1 Math (java.lang.Math)1 TEN (java.math.BigInteger.TEN)1 BigInteger.valueOf (java.math.BigInteger.valueOf)1 DOWN (java.math.RoundingMode.DOWN)1 List (java.util.List)1