private PaymentLog createRefundEntryForAmount( PaymentLog paymentLog, RefundReason reason, BigInteger cryptocurrencyAmount, BigDecimal usdAmount) throws RefundEntryAlreadyExistsException { EligibleForRefund refund = eligibleForRefundService.save( new EligibleForRefund(reason, cryptocurrencyAmount, usdAmount, paymentLog.getCurrency(), paymentLog.getInvestor(), paymentLog.getTransactionId())); paymentLog.setEligibleForRefund(refund); return paymentLog; }
@Test @Transactional(propagation = Propagation.NOT_SUPPORTED) public void testOverflowWithSingleTier() throws Throwable { // setup TestTier tt = new TestTier(1, "1970-01-01", "1970-01-03", new BigDecimal("0.25"), new BigInteger("1000").multiply(tomicsFactor()), true, false); Date blockTime = Date.valueOf("1970-01-02"); tt.newEndDateMustBe(blockTime); tt.mustBeFull(); final BigDecimal overflow = BigDecimal.TEN; final BigDecimal payment = monitorService.convertTomicsToUsd(tt.getTomicsMax(), tt.getDiscount()) .add(overflow); // test PaymentLog log = createPaymentLog(payment, blockTime); log = monitorService.allocateTokens(log); if (log.getEligibleForRefund() == null) fail(); // rounding the resulting USD overflow because that will be the actual precision with which the overflow // will be stored for refunds. assertEquals(0, log.getEligibleForRefund().getUsdAmount().round(new MathContext(6, RoundingMode.HALF_EVEN)).compareTo(overflow)); assertEquals(0, log.getAllocatedTomics().compareTo(tt.getTomicsMax())); tt.assertTier(); }
@Test @Transactional(propagation = Propagation.NOT_SUPPORTED) public void testOverflowTotalTokenAmountButNotTier() throws Throwable { // setup final Date blockTime = Date.valueOf("1970-01-02"); // tier with a capacity of total token amount plus one token. final TestTier tt1 = new TestTier(1, "1970-01-01", "1970-01-03", new BigDecimal("0.25"), totalTomicsAmount().add(tomicsFactor()), true, false); tt1.tomicsSoldMustBe(totalTomicsAmount()); final BigDecimal overflow = appConfig.getFiatBasePerToken().divide(new BigDecimal("2")); final BigDecimal payment = monitorService.convertTomicsToUsd(totalTomicsAmount(), tt1.getDiscount()).add(overflow); // test PaymentLog log = createPaymentLog(payment, blockTime); log = monitorService.allocateTokens(log); if (log.getEligibleForRefund() == null) fail(); assertEquals(0, log.getAllocatedTomics().compareTo(totalTomicsAmount())); assertEquals(0, log.getEligibleForRefund().getUsdAmount().round(new MathContext(6, RoundingMode.HALF_EVEN)).compareTo(overflow)); tt1.assertTier(); }
@Test @Transactional(propagation = Propagation.NOT_SUPPORTED) public void testOverflowTotalTokenAmountInSecondTier() throws Throwable { final BigInteger tomicsOverflowOverTier1 = tomicsFactor(); final Date blockTime = Date.valueOf("1970-01-02"); final TestTier tt1 = new TestTier(1, "1970-01-01", "1970-01-03", new BigDecimal("0.25"), totalTomicsAmount().subtract(tomicsOverflowOverTier1), true, false); tt1.mustBeFull(); tt1.newEndDateMustBe(blockTime); final TestTier tt2 = new TestTier(2, "1970-01-03", "1970-01-05", new BigDecimal("0.10"), totalTomicsAmount(), true, false); tt2.tomicsSoldMustBe(tomicsOverflowOverTier1); tt2.datesMustBeShiftedBy(tt1.getTier().getEndDate().getTime() - blockTime.getTime()); // payment setup final BigInteger tomicsToTier2 = tomicsOverflowOverTier1.multiply(BigInteger.valueOf(2)); final BigDecimal paymentToTier1 = monitorService.convertTomicsToUsd(tt1.getTomicsMax(), tt1.getDiscount()); final BigDecimal paymentToTier2 = monitorService.convertTomicsToUsd(tomicsToTier2, tt2.getDiscount()); final BigDecimal payment = paymentToTier1.add(paymentToTier2); final BigDecimal overflow = paymentToTier2.divide(new BigDecimal(2), new MathContext(6, RoundingMode.HALF_EVEN)); // test PaymentLog log = createPaymentLog(payment, blockTime); log = monitorService.allocateTokens(log); if (log.getEligibleForRefund() == null) fail(); assertEquals(0, log.getAllocatedTomics().compareTo(totalTomicsAmount())); assertEquals(0, log.getEligibleForRefund().getUsdAmount().round(new MathContext(6, RoundingMode.HALF_EVEN)).compareTo(overflow)); tt1.assertTier(); tt2.assertTier(); }
if (log.getEligibleForRefund() == null) fail(); assertEquals(0, log.getAllocatedTomics().compareTo(tt1.getTomicsMax().add(tt2.getTomicsMax()).add(tt3.getTomicsMax()))); assertEquals(0, log.getEligibleForRefund().getUsdAmount().round(new MathContext(6, RoundingMode.HALF_EVEN)).compareTo(overflow)); tt1.assertTier(); tt2.assertTier(); if (log.getEligibleForRefund() == null) fail(); assertEquals(0, log.getAllocatedTomics().compareTo(BigInteger.ZERO)); assertEquals(0, log.getEligibleForRefund().getUsdAmount().compareTo(BigDecimal.TEN));
if (log.getEligibleForRefund() == null) fail(); assertEquals(0, log.getAllocatedTomics().compareTo(overallRemainingTomics)); assertEquals(0, log.getEligibleForRefund().getUsdAmount().round(new MathContext(6, RoundingMode.HALF_EVEN)).compareTo(BigDecimal.TEN)); tiers.forEach(TestTier::assertTier); assertEquals(0, totalTomicsAmount().compareTo(saleTierService.getTotalTomicsSold()));
@Test @Transactional(propagation = Propagation.NOT_SUPPORTED) public void testOverflowTotalTokenAmountAndTier() throws Throwable { // setup final Date blockTime = Date.valueOf("1970-01-02"); // tier with a capacity of total token amount plus one token. final TestTier tt1 = new TestTier(1, "1970-01-01", "1970-01-03", new BigDecimal("0.25"), totalTomicsAmount().add(tomicsFactor()), true, false); tt1.tomicsSoldMustBe(totalTomicsAmount()); // only the total amount of tokens can be disttributed/converted. final BigDecimal usdAmountConverted = monitorService.convertTomicsToUsd(totalTomicsAmount(), tt1.getDiscount()); final BigDecimal overflowOverTier = BigDecimal.TEN; final BigDecimal payment = monitorService.convertTomicsToUsd(tt1.getTomicsMax(), tt1.getDiscount()) .add(overflowOverTier); final BigDecimal overflow = payment.subtract(usdAmountConverted); // test PaymentLog log = createPaymentLog(payment, blockTime); log = monitorService.allocateTokens(log); if (log.getEligibleForRefund() == null) fail(); assertEquals(0, log.getAllocatedTomics().compareTo(totalTomicsAmount())); assertEquals(0, log.getEligibleForRefund().getUsdAmount().round(new MathContext(6, RoundingMode.HALF_EVEN)).compareTo(overflow)); tt1.assertTier(); }
@Test @Transactional(propagation = Propagation.NOT_SUPPORTED) public void testOverflowTotalTokenAmountWithHalfFullTier() throws Throwable { final Date blockTime = Date.valueOf("1970-01-02"); // tier with a capacity of total token amount plus one token. final TestTier t = new TestTier(1, "1970-01-01", "1970-01-03", new BigDecimal("0.25"), totalTomicsAmount().add(tomicsFactor()), true, false); BigInteger tomicsFromTier = totalTomicsAmount().divide(new BigInteger("2")); BigDecimal payment = monitorService.convertTomicsToUsd(tomicsFromTier, t.getDiscount()); PaymentLog log = createPaymentLog(payment, blockTime); log = monitorService.allocateTokens(log); t.tomicsSoldMustBe(tomicsFromTier); if (log.getEligibleForRefund() != null) fail(); assertEquals(0, log.getAllocatedTomics().compareTo(tomicsFromTier)); t.assertTier(); final BigDecimal overflow = appConfig.getFiatBasePerToken().divide(new BigDecimal("2")); payment = monitorService.convertTomicsToUsd(tomicsFromTier, t.getDiscount()).add(overflow); t.tomicsSoldMustBe(totalTomicsAmount()); log = createPaymentLog(payment, blockTime); log = monitorService.allocateTokens(log); if (log.getEligibleForRefund() == null) fail(); assertEquals(0, log.getAllocatedTomics().compareTo(tomicsFromTier)); assertEquals(0, log.getEligibleForRefund().getUsdAmount().round(new MathContext(6, RoundingMode.HALF_EVEN)).compareTo(overflow)); t.assertTier(); }