From 47417144bdd3057b71822a5836dd325747d624eb Mon Sep 17 00:00:00 2001 From: Andrew Boyarsky Date: Fri, 24 Jan 2020 16:26:42 +0200 Subject: [PATCH] Add pagination for 'getExpiredSwaps' --- .../apl/eth/contracts/DexContract.java | 18 ++++++++++-------- .../apl/exchange/mapper/ExpiredSwapMapper.java | 18 +++++++++--------- .../mapper/UserEthDepositInfoMapper.java | 2 +- .../exchange/model/EthDepositsWithOffset.java | 9 +++------ .../exchange/model/ExpiredSwapsWithOffset.java | 13 +++++++++++++ .../apl/exchange/model/OffsetModel.java | 8 ++++++++ .../exchange/service/DexOrderProcessor.java | 17 ++++++++++++----- .../service/DexSmartContractService.java | 6 +++--- 8 files changed, 59 insertions(+), 32 deletions(-) create mode 100644 apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/model/ExpiredSwapsWithOffset.java create mode 100644 apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/model/OffsetModel.java diff --git a/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/eth/contracts/DexContract.java b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/eth/contracts/DexContract.java index 675b5c6ac8..f8d307d5a2 100644 --- a/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/eth/contracts/DexContract.java +++ b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/eth/contracts/DexContract.java @@ -707,20 +707,22 @@ 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 org.web3j.abi.datatypes.Address(user), new Uint256(offset), new Uint256(limit)), Arrays.>asList(new TypeReference>() { }, new TypeReference>() { - })); - return new RemoteCall, List>>( - new Callable, List>>() { + }, new TypeReference() {})); + return new RemoteCall, List, BigInteger>>( + new Callable, List, BigInteger>>() { @Override - public Tuple2, List> call() throws Exception { + public Tuple3, List, BigInteger> call() throws Exception { List results = executeCallMultipleValueReturn(function); - return new Tuple2, List>( + return new Tuple3, List, BigInteger>( convertToNative((List) results.get(0).getValue()), - convertToNative((List) results.get(1).getValue())); + convertToNative((List) results.get(1).getValue()), + (BigInteger) results.get(2).getValue() + ); } }); } diff --git a/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/mapper/ExpiredSwapMapper.java b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/mapper/ExpiredSwapMapper.java index b8938419b4..f0f9f95198 100644 --- a/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/mapper/ExpiredSwapMapper.java +++ b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/mapper/ExpiredSwapMapper.java @@ -1,27 +1,27 @@ package com.apollocurrency.aplwallet.apl.exchange.mapper; import com.apollocurrency.aplwallet.apl.exchange.model.ExpiredSwap; +import com.apollocurrency.aplwallet.apl.exchange.model.ExpiredSwapsWithOffset; import org.apache.commons.collections4.CollectionUtils; -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) { + public static ExpiredSwapsWithOffset map(Tuple3, List, BigInteger> data) { + ExpiredSwapsWithOffset swapsWithOffset = new ExpiredSwapsWithOffset(); - List swaps = new ArrayList<>(); - - if (data == null || CollectionUtils.isEmpty(data.getValue1())) { - return swaps; + if (data == null || CollectionUtils.isEmpty(data.component1())) { + 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-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/mapper/UserEthDepositInfoMapper.java b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/mapper/UserEthDepositInfoMapper.java index 6f4b63bffa..721ae583bf 100644 --- a/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/mapper/UserEthDepositInfoMapper.java +++ b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/mapper/UserEthDepositInfoMapper.java @@ -15,7 +15,7 @@ public class UserEthDepositInfoMapper { public static EthDepositsWithOffset map(Tuple4, List, List, BigInteger> data) { EthDepositsWithOffset ethDepositsWithOffset = new EthDepositsWithOffset(); - if (data == null || CollectionUtils.isEmpty(data.getValue1())) { + if (data == null || CollectionUtils.isEmpty(data.component1())) { return ethDepositsWithOffset; } diff --git a/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/model/EthDepositsWithOffset.java b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/model/EthDepositsWithOffset.java index 57acb5bcfc..49ed69d731 100644 --- a/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/model/EthDepositsWithOffset.java +++ b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/model/EthDepositsWithOffset.java @@ -1,16 +1,13 @@ package com.apollocurrency.aplwallet.apl.exchange.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-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/model/ExpiredSwapsWithOffset.java b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/model/ExpiredSwapsWithOffset.java new file mode 100644 index 0000000000..57afb2a0fd --- /dev/null +++ b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/model/ExpiredSwapsWithOffset.java @@ -0,0 +1,13 @@ +package com.apollocurrency.aplwallet.apl.exchange.model; + +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<>(); +} diff --git a/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/model/OffsetModel.java b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/model/OffsetModel.java new file mode 100644 index 0000000000..2a4dbf8f25 --- /dev/null +++ b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/model/OffsetModel.java @@ -0,0 +1,8 @@ +package com.apollocurrency.aplwallet.apl.exchange.model; + +import lombok.Data; + +@Data +public abstract class OffsetModel { + private long offset; +} 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 83edc15ef2..e3cd3e1268 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 @@ -39,6 +39,7 @@ import com.apollocurrency.aplwallet.apl.exchange.model.ExchangeContract; import com.apollocurrency.aplwallet.apl.exchange.model.ExchangeContractStatus; import com.apollocurrency.aplwallet.apl.exchange.model.ExpiredSwap; +import com.apollocurrency.aplwallet.apl.exchange.model.ExpiredSwapsWithOffset; import com.apollocurrency.aplwallet.apl.exchange.model.MandatoryTransaction; import com.apollocurrency.aplwallet.apl.exchange.model.OrderHeightId; import com.apollocurrency.aplwallet.apl.exchange.model.OrderStatus; @@ -867,11 +868,17 @@ public void refundExpiredAtomicSwaps(long accountId) { List addresses = dexSmartContractService.getEthUserAddresses(passphrase, accountId); 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/DexSmartContractService.java b/apl-core/src/main/java/com/apollocurrency/aplwallet/apl/exchange/service/DexSmartContractService.java index 195d61dd69..9428c385ff 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 @@ -21,7 +21,7 @@ import com.apollocurrency.aplwallet.apl.exchange.model.DexOrder; import com.apollocurrency.aplwallet.apl.exchange.model.DexTransaction; import com.apollocurrency.aplwallet.apl.exchange.model.EthDepositsWithOffset; -import com.apollocurrency.aplwallet.apl.exchange.model.ExpiredSwap; +import com.apollocurrency.aplwallet.apl.exchange.model.ExpiredSwapsWithOffset; import com.apollocurrency.aplwallet.apl.exchange.model.OrderType; import com.apollocurrency.aplwallet.apl.exchange.model.SwapDataInfo; import com.apollocurrency.aplwallet.apl.util.AplException; @@ -285,10 +285,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, 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()); }