From fb6ee30bfa17fb4ccac29917a3b101b1e8d1dc8b Mon Sep 17 00:00:00 2001 From: chaozhu Date: Tue, 8 Nov 2022 11:13:57 +0800 Subject: [PATCH] feat(freezeV2): new stake, add 1 interfaces --- .../src/main/java/org/tron/core/Wallet.java | 39 +++++++++++- .../org/tron/core/services/RpcApiService.java | 29 ++++++++- .../services/http/FullNodeHttpApiService.java | 4 ++ .../GetAvailableUnfreezeCountServlet.java | 63 +++++++++++++++++++ .../GetCanWithdrawUnfreezeAmountServlet.java | 6 +- .../http/HttpSelfFormatFieldName.java | 1 + .../solidity/SolidityNodeHttpApiService.java | 5 ++ ...ailableUnfreezeCountOnSolidityServlet.java | 29 +++++++++ .../solidity/HttpApiOnSolidityService.java | 5 ++ protocol/src/main/protos/api/api.proto | 16 +++++ 10 files changed, 191 insertions(+), 6 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/http/GetAvailableUnfreezeCountServlet.java create mode 100644 framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetAvailableUnfreezeCountOnSolidityServlet.java diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 064f02443af..ba8e8e9a8be 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -123,6 +123,7 @@ import org.tron.consensus.ConsensusDelegate; import org.tron.core.actuator.Actuator; import org.tron.core.actuator.ActuatorFactory; +import org.tron.core.actuator.UnfreezeBalanceV2Actuator; import org.tron.core.actuator.VMActuator; import org.tron.core.capsule.AbiCapsule; import org.tron.core.capsule.AccountCapsule; @@ -766,7 +767,7 @@ public DelegatedResourceList getDelegatedResourceV2( } public GrpcAPI.CanWithdrawUnfreezeAmountResponseMessage getCanWithdrawUnfreezeAmount( - ByteString ownerAddress) { + ByteString ownerAddress, long timestamp) { GrpcAPI.CanWithdrawUnfreezeAmountResponseMessage.Builder builder = GrpcAPI.CanWithdrawUnfreezeAmountResponseMessage.newBuilder(); long canWithdrawUnfreezeAmount; @@ -777,14 +778,19 @@ public GrpcAPI.CanWithdrawUnfreezeAmountResponseMessage getCanWithdrawUnfreezeAm if (accountCapsule == null) { return builder.build(); } - long now = dynamicStore.getLatestBlockHeaderTimestamp(); + + if (timestamp == 0) { + timestamp = dynamicStore.getLatestBlockHeaderTimestamp(); + } List unfrozenV2List = accountCapsule.getInstance().getUnfrozenV2List(); + long finalTimestamp = timestamp; + canWithdrawUnfreezeAmount = unfrozenV2List .stream() .filter(unfrozenV2 -> (unfrozenV2.getUnfreezeAmount() > 0 - && unfrozenV2.getUnfreezeExpireTime() <= now)) + && unfrozenV2.getUnfreezeExpireTime() <= finalTimestamp)) .mapToLong(Account.UnFreezeV2::getUnfreezeAmount) .sum(); @@ -793,6 +799,33 @@ public GrpcAPI.CanWithdrawUnfreezeAmountResponseMessage getCanWithdrawUnfreezeAm return builder.build(); } + public GrpcAPI.GetAvailableUnfreezeCountResponseMessage getAvailableUnfreezeCount( + ByteString ownerAddress) { + long getAvailableUnfreezeCount; + GrpcAPI.GetAvailableUnfreezeCountResponseMessage.Builder builder = + GrpcAPI.GetAvailableUnfreezeCountResponseMessage.newBuilder(); + + AccountStore accountStore = chainBaseManager.getAccountStore(); + DynamicPropertiesStore dynamicStore = chainBaseManager.getDynamicPropertiesStore(); + AccountCapsule accountCapsule = accountStore.get(ownerAddress.toByteArray()); + if (accountCapsule == null) { + return builder.build(); + } + long now = dynamicStore.getLatestBlockHeaderTimestamp(); + + List unfrozenV2List = accountCapsule.getInstance().getUnfrozenV2List(); + long getUsedUnfreezeCount = unfrozenV2List + .stream() + .filter(unfrozenV2 -> + (unfrozenV2.getUnfreezeAmount() > 0 + && unfrozenV2.getUnfreezeExpireTime() > now)) + .count(); + getAvailableUnfreezeCount = UnfreezeBalanceV2Actuator.getUNFREEZE_MAX_TIMES() + - getUsedUnfreezeCount; + builder.setCount(getAvailableUnfreezeCount); + return builder.build(); + } + public DelegatedResourceAccountIndex getDelegatedResourceAccountIndex(ByteString address) { DelegatedResourceAccountIndexCapsule accountIndexCapsule = chainBaseManager.getDelegatedResourceAccountIndexStore().get(address.toByteArray()); diff --git a/framework/src/main/java/org/tron/core/services/RpcApiService.java b/framework/src/main/java/org/tron/core/services/RpcApiService.java index d8976d36547..40f62440ebb 100755 --- a/framework/src/main/java/org/tron/core/services/RpcApiService.java +++ b/framework/src/main/java/org/tron/core/services/RpcApiService.java @@ -638,13 +638,25 @@ public void getDelegatedResourceAccountIndexV2(BytesMessage request, responseObserver.onCompleted(); } + @Override + public void getAvailableUnfreezeCount(GrpcAPI.GetAvailableUnfreezeCountRequestMessage request, + StreamObserver responseObserver) { + try { + responseObserver.onNext(wallet.getAvailableUnfreezeCount( + request.getOwnerAddress())); + } catch (Exception e) { + responseObserver.onError(getRunTimeException(e)); + } + responseObserver.onCompleted(); + } + @Override public void getCanWithdrawUnfreezeAmount(CanWithdrawUnfreezeAmountRequestMessage request, StreamObserver responseObserver) { try { responseObserver .onNext(wallet.getCanWithdrawUnfreezeAmount( - request.getOwnerAddress()) + request.getOwnerAddress(), request.getTimestamp()) ); } catch (Exception e) { responseObserver.onError(getRunTimeException(e)); @@ -2097,13 +2109,26 @@ public void getDelegatedResourceAccountIndexV2(BytesMessage request, responseObserver.onCompleted(); } + @Override + public void getAvailableUnfreezeCount(GrpcAPI.GetAvailableUnfreezeCountRequestMessage request, + StreamObserver responseObserver) { + try { + responseObserver.onNext(wallet.getAvailableUnfreezeCount( + request.getOwnerAddress())); + } catch (Exception e) { + responseObserver.onError(getRunTimeException(e)); + } + + responseObserver.onCompleted(); + } + @Override public void getCanWithdrawUnfreezeAmount(CanWithdrawUnfreezeAmountRequestMessage request, StreamObserver responseObserver) { try { responseObserver .onNext(wallet.getCanWithdrawUnfreezeAmount( - request.getOwnerAddress() + request.getOwnerAddress(), request.getTimestamp() )); } catch (Exception e) { responseObserver.onError(getRunTimeException(e)); diff --git a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java index b2ebf1af7ad..f9c804629ac 100644 --- a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java @@ -188,6 +188,8 @@ public class FullNodeHttpApiService implements Service { @Autowired private GetDelegatedResourceV2Servlet getDelegatedResourceV2Servlet; @Autowired + private GetAvailableUnfreezeCountServlet getAvailableUnfreezeCountServlet; + @Autowired private GetCanWithdrawUnfreezeAmountServlet getCanWithdrawUnfreezeAmountServlet; @Autowired private SetAccountIdServlet setAccountServlet; @@ -470,6 +472,8 @@ public void start() { "/wallet/getdelegatedresource"); context.addServlet(new ServletHolder(getDelegatedResourceV2Servlet), "/wallet/getdelegatedresourcev2"); + context.addServlet(new ServletHolder(getAvailableUnfreezeCountServlet), + "/wallet/getavailableunfreezecount"); context.addServlet(new ServletHolder(getCanWithdrawUnfreezeAmountServlet), "/wallet/getcanwithdrawunfreezeamount"); context.addServlet( diff --git a/framework/src/main/java/org/tron/core/services/http/GetAvailableUnfreezeCountServlet.java b/framework/src/main/java/org/tron/core/services/http/GetAvailableUnfreezeCountServlet.java new file mode 100644 index 00000000000..28fec9f3ee3 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/http/GetAvailableUnfreezeCountServlet.java @@ -0,0 +1,63 @@ +package org.tron.core.services.http; + +import com.google.protobuf.ByteString; +import java.io.IOException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.api.GrpcAPI; +import org.tron.common.utils.ByteArray; +import org.tron.core.Wallet; + +@Component +@Slf4j(topic = "API") +public class GetAvailableUnfreezeCountServlet extends RateLimiterServlet { + + @Autowired + private Wallet wallet; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + try { + boolean visible = Util.getVisible(request); + String ownerAddress = request.getParameter("ownerAddress"); + if (visible) { + ownerAddress = Util.getHexAddress(ownerAddress); + } + fillResponse(visible, + ByteString.copyFrom(ByteArray.fromHexString(ownerAddress)), + response); + } catch (Exception e) { + Util.processError(e, response); + } + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + try { + PostParams params = PostParams.getPostParams(request); + GrpcAPI.GetAvailableUnfreezeCountRequestMessage.Builder build = + GrpcAPI.GetAvailableUnfreezeCountRequestMessage.newBuilder(); + JsonFormat.merge(params.getParams(), build, params.isVisible()); + fillResponse(params.isVisible(), + build.getOwnerAddress(), + response); + } catch (Exception e) { + Util.processError(e, response); + } + } + + private void fillResponse(boolean visible, + ByteString ownerAddress, + HttpServletResponse response) throws IOException { + GrpcAPI.GetAvailableUnfreezeCountResponseMessage reply = + wallet.getAvailableUnfreezeCount(ownerAddress); + if (reply != null) { + response.getWriter().println(JsonFormat.printToString(reply, visible)); + } else { + response.getWriter().println("{}"); + } + } +} diff --git a/framework/src/main/java/org/tron/core/services/http/GetCanWithdrawUnfreezeAmountServlet.java b/framework/src/main/java/org/tron/core/services/http/GetCanWithdrawUnfreezeAmountServlet.java index fd1547d3931..4c1bbaf4f99 100644 --- a/framework/src/main/java/org/tron/core/services/http/GetCanWithdrawUnfreezeAmountServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/GetCanWithdrawUnfreezeAmountServlet.java @@ -22,11 +22,13 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) { try { boolean visible = Util.getVisible(request); String ownerAddress = request.getParameter("owner_address"); + long timestamp = Long.valueOf(request.getParameter("timestamp")); if (visible) { ownerAddress = Util.getHexAddress(ownerAddress); } fillResponse(visible, ByteString.copyFrom(ByteArray.fromHexString(ownerAddress)), + timestamp, response); } catch (Exception e) { Util.processError(e, response); @@ -41,6 +43,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) JsonFormat.merge(params.getParams(), build, params.isVisible()); fillResponse(params.isVisible(), build.getOwnerAddress(), + build.getTimestamp(), response); } catch (Exception e) { Util.processError(e, response); @@ -49,9 +52,10 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) private void fillResponse(boolean visible, ByteString ownerAddress, + long timestamp, HttpServletResponse response) throws IOException { GrpcAPI.CanWithdrawUnfreezeAmountResponseMessage reply = - wallet.getCanWithdrawUnfreezeAmount(ownerAddress); + wallet.getCanWithdrawUnfreezeAmount(ownerAddress, timestamp); if (reply != null) { response.getWriter().println(JsonFormat.printToString(reply, visible)); } else { diff --git a/framework/src/main/java/org/tron/core/services/http/HttpSelfFormatFieldName.java b/framework/src/main/java/org/tron/core/services/http/HttpSelfFormatFieldName.java index 7e320806de7..eb776a7e1c0 100644 --- a/framework/src/main/java/org/tron/core/services/http/HttpSelfFormatFieldName.java +++ b/framework/src/main/java/org/tron/core/services/http/HttpSelfFormatFieldName.java @@ -154,6 +154,7 @@ public class HttpSelfFormatFieldName { //UnDelegateResourceContract AddressFieldNameMap.put("protocol.UnDelegateResourceContract.owner_address", 1); AddressFieldNameMap.put("protocol.UnDelegateResourceContract.receiver_address", 1); + AddressFieldNameMap.put("protocol.GetAvailableUnfreezeCountRequestMessage.owner_address", 1); AddressFieldNameMap.put("protocol.CanWithdrawUnfreezeAmountRequestMessage.owner_address", 1); //***** Tron.proto ***** diff --git a/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java index de7d8491018..0830568ad54 100644 --- a/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/solidity/SolidityNodeHttpApiService.java @@ -23,6 +23,7 @@ import org.tron.core.services.http.GetAssetIssueByNameServlet; import org.tron.core.services.http.GetAssetIssueListByNameServlet; import org.tron.core.services.http.GetAssetIssueListServlet; +import org.tron.core.services.http.GetAvailableUnfreezeCountServlet; import org.tron.core.services.http.GetBlockByIdServlet; import org.tron.core.services.http.GetBlockByLatestNumServlet; import org.tron.core.services.http.GetBlockByLimitNextServlet; @@ -85,6 +86,8 @@ public class SolidityNodeHttpApiService implements Service { @Autowired private GetDelegatedResourceV2Servlet getDelegatedResourceV2Servlet; @Autowired + private GetAvailableUnfreezeCountServlet getAvailableUnfreezeCountServlet; + @Autowired private GetCanWithdrawUnfreezeAmountServlet getCanWithdrawUnfreezeAmountServlet; @Autowired private GetDelegatedResourceAccountIndexServlet getDelegatedResourceAccountIndexServlet; @@ -212,6 +215,8 @@ public void start() { "/walletsolidity/getdelegatedresource"); context.addServlet(new ServletHolder(getDelegatedResourceV2Servlet), "/walletsolidity/getdelegatedresourcev2"); + context.addServlet(new ServletHolder(getAvailableUnfreezeCountServlet), + "/walletsolidity/getavailableunfreezecount"); context.addServlet(new ServletHolder(getCanWithdrawUnfreezeAmountServlet), "/walletsolidity/getcanwithdrawunfreezeamount"); context.addServlet(new ServletHolder(getDelegatedResourceAccountIndexServlet), diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetAvailableUnfreezeCountOnSolidityServlet.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetAvailableUnfreezeCountOnSolidityServlet.java new file mode 100644 index 00000000000..218164fffb0 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/GetAvailableUnfreezeCountOnSolidityServlet.java @@ -0,0 +1,29 @@ +package org.tron.core.services.interfaceOnSolidity.http; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.Wallet; +import org.tron.core.services.http.GetAvailableUnfreezeCountServlet; +import org.tron.core.services.interfaceOnSolidity.WalletOnSolidity; + +@Component +@Slf4j(topic = "API") +public class GetAvailableUnfreezeCountOnSolidityServlet extends GetAvailableUnfreezeCountServlet { + + @Autowired + private Wallet wallet; + + @Autowired + private WalletOnSolidity walletOnSolidity; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + walletOnSolidity.futureGet(() -> super.doGet(request, response)); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + walletOnSolidity.futureGet(() -> super.doPost(request, response)); + } +} diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java index fc1f0c592dd..89da15b8555 100644 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/http/solidity/HttpApiOnSolidityService.java @@ -22,6 +22,7 @@ import org.tron.core.services.interfaceOnSolidity.http.GetAssetIssueByNameOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetAssetIssueListByNameOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetAssetIssueListOnSolidityServlet; +import org.tron.core.services.interfaceOnSolidity.http.GetAvailableUnfreezeCountOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetBlockByIdOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetBlockByLatestNumOnSolidityServlet; import org.tron.core.services.interfaceOnSolidity.http.GetBlockByLimitNextOnSolidityServlet; @@ -93,6 +94,8 @@ public class HttpApiOnSolidityService implements Service { @Autowired private GetDelegatedResourceV2OnSolidityServlet getDelegatedResourceV2OnSolidityServlet; @Autowired + private GetAvailableUnfreezeCountOnSolidityServlet getAvailableUnfreezeCountOnSolidityServlet; + @Autowired private GetCanWithdrawUnfreezeAmountOnSolidityServlet getCanWithdrawUnfreezeAmountOnSolidityServlet; @Autowired @@ -212,6 +215,8 @@ public void start() { "/walletsolidity/getdelegatedresource"); context.addServlet(new ServletHolder(getDelegatedResourceV2OnSolidityServlet), "/walletsolidity/getdelegatedresourcev2"); + context.addServlet(new ServletHolder(getAvailableUnfreezeCountOnSolidityServlet), + "/walletsolidity/getavailableunfreezecount"); context.addServlet(new ServletHolder(getCanWithdrawUnfreezeAmountOnSolidityServlet), "/walletsolidity/getcanwithdrawunfreezeamount"); context.addServlet(new ServletHolder(getDelegatedResourceAccountIndexOnSolidityServlet), diff --git a/protocol/src/main/protos/api/api.proto b/protocol/src/main/protos/api/api.proto index 4d75f0e9326..d94da7cad80 100644 --- a/protocol/src/main/protos/api/api.proto +++ b/protocol/src/main/protos/api/api.proto @@ -506,6 +506,10 @@ service Wallet { rpc GetDelegatedResourceAccountIndexV2 (BytesMessage) returns (DelegatedResourceAccountIndex) { }; + rpc GetAvailableUnfreezeCount (GetAvailableUnfreezeCountRequestMessage) + returns (GetAvailableUnfreezeCountResponseMessage) { + }; + rpc GetCanWithdrawUnfreezeAmount (CanWithdrawUnfreezeAmountRequestMessage) returns (CanWithdrawUnfreezeAmountResponseMessage) { } @@ -920,6 +924,10 @@ service WalletSolidity { rpc GetDelegatedResourceAccountIndexV2 (BytesMessage) returns (DelegatedResourceAccountIndex) { }; + rpc GetAvailableUnfreezeCount (GetAvailableUnfreezeCountRequestMessage) + returns (GetAvailableUnfreezeCountResponseMessage) { + }; + rpc GetCanWithdrawUnfreezeAmount (CanWithdrawUnfreezeAmountRequestMessage) returns (CanWithdrawUnfreezeAmountResponseMessage) { } @@ -1138,8 +1146,16 @@ message DelegatedResourceList { repeated DelegatedResource delegatedResource = 1; } +message GetAvailableUnfreezeCountRequestMessage { + bytes owner_address = 1; +} +message GetAvailableUnfreezeCountResponseMessage { + int64 count = 1; +} + message CanWithdrawUnfreezeAmountRequestMessage { bytes owner_address = 1; + int64 timestamp = 2; } message CanWithdrawUnfreezeAmountResponseMessage { int64 amount = 1;