diff --git a/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/service/DexOrderProcessor.java b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/service/DexOrderProcessor.java index f1d8619707..c9c91b9529 100644 --- a/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/service/DexOrderProcessor.java +++ b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/service/DexOrderProcessor.java @@ -37,6 +37,7 @@ import com.apollocurrency.aplwallet.apl.dex.core.model.SwapDataInfo; import com.apollocurrency.aplwallet.apl.dex.eth.model.EthDepositInfo; import com.apollocurrency.aplwallet.apl.dex.eth.model.EthDepositsWithOffset; +import com.apollocurrency.aplwallet.apl.dex.eth.model.ExpiredSwapsWithOffset; import com.apollocurrency.aplwallet.apl.dex.eth.service.EthereumWalletService; import com.apollocurrency.aplwallet.apl.exchange.util.DexCurrencyValidator; import com.apollocurrency.aplwallet.apl.util.Convert2; @@ -843,11 +844,17 @@ public void refundExpiredAtomicSwaps(long accountId) { List addresses = kmsService.getEthWalletAddresses(accountId, passphrase); for (String address : addresses) { try { - List expiredSwaps = dexSmartContractService.getExpiredSwaps(address); - for (ExpiredSwap expiredSwap : expiredSwaps) { - log.info("Refunding atomic swap {}, id {}", Numeric.toHexString(expiredSwap.getSecretHash()), expiredSwap.getOrderId()); - dexSmartContractService.refundAndWithdraw(expiredSwap.getSecretHash(), passphrase, address, accountId, false); - } + long offset = 0; + ExpiredSwapsWithOffset swapsWithOffset; + do { + swapsWithOffset = dexSmartContractService.getExpiredSwaps(address, offset, CONTRACT_FETCH_SIZE); + offset = swapsWithOffset.getOffset(); + for (ExpiredSwap expiredSwap : swapsWithOffset.getSwaps()) { + log.info("Refunding atomic swap {}, id {}", Numeric.toHexString(expiredSwap.getSecretHash()), expiredSwap.getOrderId()); + dexSmartContractService.refundAndWithdraw(expiredSwap.getSecretHash(), passphrase, address, accountId, false); + } + } while (swapsWithOffset.getSwaps().size() == CONTRACT_FETCH_SIZE); + } catch (AplException.ExecutiveProcessException e) { log.error(e.getMessage(), e); } diff --git a/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/service/DexService.java b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/service/DexService.java index d471b4dede..b608eabe73 100644 --- a/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/service/DexService.java +++ b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/service/DexService.java @@ -65,6 +65,7 @@ import com.apollocurrency.aplwallet.apl.dex.eth.model.EthDepositInfo; import com.apollocurrency.aplwallet.apl.dex.eth.model.EthDepositsWithOffset; import com.apollocurrency.aplwallet.apl.dex.eth.model.EthWalletBalanceInfo; +import com.apollocurrency.aplwallet.apl.dex.eth.model.ExpiredSwapsWithOffset; import com.apollocurrency.aplwallet.apl.dex.eth.service.EthereumWalletService; import com.apollocurrency.aplwallet.apl.dex.eth.utils.EthUtil; import com.apollocurrency.aplwallet.apl.exchange.dao.DexContractDao; @@ -1052,11 +1053,13 @@ public List getAllFilledOrders() throws AplException.Exe public List getAllExpiredSwaps() throws AplException.ExecutiveProcessException { List addressEthExpiredSwaps = new ArrayList<>(); List addresses = getAllUsers(); + int offset = 0; + int limit = 100; for (String address : addresses) { try { - List expiredSwaps = dexSmartContractService.getExpiredSwaps(address); - addressEthExpiredSwaps.add(new AddressEthExpiredSwaps(address, expiredSwaps)); + ExpiredSwapsWithOffset expiredSwaps = dexSmartContractService.getExpiredSwaps(address, offset, limit); + addressEthExpiredSwaps.add(new AddressEthExpiredSwaps(address, expiredSwaps.getSwaps())); } catch (Exception ex) { log.warn(ex.getMessage()); } diff --git a/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/service/DexSmartContractService.java b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/service/DexSmartContractService.java index fdc5789576..8cce43c678 100644 --- a/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/service/DexSmartContractService.java +++ b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/service/DexSmartContractService.java @@ -11,13 +11,13 @@ import com.apollocurrency.aplwallet.apl.dex.core.model.DepositedOrderDetails; import com.apollocurrency.aplwallet.apl.dex.core.model.DexCurrency; import com.apollocurrency.aplwallet.apl.dex.core.model.DexTransaction; -import com.apollocurrency.aplwallet.apl.dex.core.model.ExpiredSwap; import com.apollocurrency.aplwallet.apl.dex.core.model.OrderType; import com.apollocurrency.aplwallet.apl.dex.core.model.SwapDataInfo; import com.apollocurrency.aplwallet.apl.dex.core.model.UserAddressesWithOffset; import com.apollocurrency.aplwallet.apl.dex.eth.contracts.DexContract; import com.apollocurrency.aplwallet.apl.dex.eth.contracts.DexContractImpl; import com.apollocurrency.aplwallet.apl.dex.eth.model.EthDepositsWithOffset; +import com.apollocurrency.aplwallet.apl.dex.eth.model.ExpiredSwapsWithOffset; import com.apollocurrency.aplwallet.apl.dex.eth.service.DexBeanProducer; import com.apollocurrency.aplwallet.apl.dex.eth.service.DexEthService; import com.apollocurrency.aplwallet.apl.dex.eth.service.EthereumWalletService; @@ -278,10 +278,10 @@ public EthDepositsWithOffset getUserFilledOrders(String user, long offset, long } } - public List getExpiredSwaps(String user) throws AplException.ExecutiveProcessException { + public ExpiredSwapsWithOffset getExpiredSwaps(String user, long offset, long limit) throws AplException.ExecutiveProcessException { DexContract dexContract = new DexContractImpl(smartContractAddress, dexBeanProducer.web3j(), Credentials.create(ACCOUNT_TO_READ_DATA), null); try { - return ExpiredSwapMapper.map(dexContract.getExpiredSwaps(user).sendAsync().get()); + return ExpiredSwapMapper.map(dexContract.getExpiredSwaps(user, offset, limit).sendAsync().get()); } catch (Exception e) { throw new AplException.ExecutiveProcessException(e.getMessage()); } diff --git a/apl-desktop/src/main/resources-dev/logback.xml b/apl-desktop/src/main/resources-dev/logback.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/core/mapper/ExpiredSwapMapper.java b/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/core/mapper/ExpiredSwapMapper.java index 3ee883aa49..42c1b02c7f 100644 --- a/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/core/mapper/ExpiredSwapMapper.java +++ b/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/core/mapper/ExpiredSwapMapper.java @@ -1,27 +1,28 @@ package com.apollocurrency.aplwallet.apl.dex.core.mapper; import com.apollocurrency.aplwallet.apl.dex.core.model.ExpiredSwap; +import com.apollocurrency.aplwallet.apl.dex.eth.model.ExpiredSwapsWithOffset; import com.apollocurrency.aplwallet.apl.util.AplCollectionUtils; -import org.web3j.tuples.generated.Tuple2; +import org.web3j.tuples.generated.Tuple3; import java.math.BigInteger; -import java.util.ArrayList; import java.util.List; public class ExpiredSwapMapper { - public static List map(Tuple2, List> data) { - List swaps = new ArrayList<>(); + public static ExpiredSwapsWithOffset map(Tuple3, List, BigInteger> data) { + ExpiredSwapsWithOffset swapsWithOffset = new ExpiredSwapsWithOffset(); if (data == null || AplCollectionUtils.isEmpty(data.component1())) { - return swaps; + return swapsWithOffset; } for (int i = 0; i < data.component1().size(); i++) { - swaps.add(new ExpiredSwap(Long.parseUnsignedLong( + swapsWithOffset.getSwaps().add(new ExpiredSwap(Long.parseUnsignedLong( data.component1().get(i).toString()), (data.component2().get(i)) )); } - return swaps; + swapsWithOffset.setOffset(data.component3().longValue()); + return swapsWithOffset; } } diff --git a/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/eth/contracts/DexContract.java b/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/eth/contracts/DexContract.java index 63a7fa0964..95edbe45e5 100644 --- a/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/eth/contracts/DexContract.java +++ b/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/eth/contracts/DexContract.java @@ -710,19 +710,24 @@ public AssetWithdrawalEventResponse apply(Log log) { }); } - public RemoteCall, List>> getExpiredSwaps(String user) { + public RemoteCall, List, BigInteger>> getExpiredSwaps(String user, long offset, long limit) { final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_GETEXPIREDSWAPS, - Arrays.asList(new org.web3j.abi.datatypes.Address(user)), - Arrays.>asList(new TypeReference>() { - }, new TypeReference>() { - })); - return new RemoteCall<>( - () -> { - List results = executeCallMultipleValueReturn(function); - return new Tuple2<>( - convertToNative((List) results.get(0).getValue()), - convertToNative((List) results.get(1).getValue())); - }); + Arrays.asList(new org.web3j.abi.datatypes.Address(user), new Uint256(offset), new Uint256(limit)), + Arrays.>asList(new TypeReference>() { + }, new TypeReference>() { + }, new TypeReference() {})); + return new RemoteCall, List, BigInteger>>( + new Callable, List, BigInteger>>() { + @Override + public Tuple3, List, BigInteger> call() throws Exception { + List results = executeCallMultipleValueReturn(function); + return new Tuple3, List, BigInteger>( + convertToNative((List) results.get(0).getValue()), + convertToNative((List) results.get(1).getValue()), + (BigInteger) results.get(2).getValue() + ); + } + }); } public RemoteCall getUserById(BigInteger userId) { diff --git a/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/eth/model/EthDepositsWithOffset.java b/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/eth/model/EthDepositsWithOffset.java index 56e9267baf..84cf7186eb 100644 --- a/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/eth/model/EthDepositsWithOffset.java +++ b/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/eth/model/EthDepositsWithOffset.java @@ -1,16 +1,13 @@ package com.apollocurrency.aplwallet.apl.dex.eth.model; -import lombok.AllArgsConstructor; import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.EqualsAndHashCode; import java.util.ArrayList; import java.util.List; +@EqualsAndHashCode(callSuper = true) @Data -@AllArgsConstructor -@NoArgsConstructor -public class EthDepositsWithOffset { +public class EthDepositsWithOffset extends OffsetModel { private List deposits = new ArrayList<>(); - private long offset; } diff --git a/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/eth/model/ExpiredSwapsWithOffset.java b/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/eth/model/ExpiredSwapsWithOffset.java new file mode 100644 index 0000000000..f5c6b92a5b --- /dev/null +++ b/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/eth/model/ExpiredSwapsWithOffset.java @@ -0,0 +1,14 @@ +package com.apollocurrency.aplwallet.apl.dex.eth.model; + +import com.apollocurrency.aplwallet.apl.dex.core.model.ExpiredSwap; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.ArrayList; +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Data +public class ExpiredSwapsWithOffset extends OffsetModel { + List swaps = new ArrayList<>(); +} \ No newline at end of file diff --git a/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/eth/model/OffsetModel.java b/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/eth/model/OffsetModel.java new file mode 100644 index 0000000000..98ff9640c0 --- /dev/null +++ b/apl-dex/src/main/java/com/apollocurrency/aplwallet/apl/dex/eth/model/OffsetModel.java @@ -0,0 +1,8 @@ +package com.apollocurrency.aplwallet.apl.dex.eth.model; + +import lombok.Data; + +@Data +public abstract class OffsetModel { + private long offset; +} \ No newline at end of file