Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(freezeV2): add one interface for new stake model #4774

Merged
merged 1 commit into from
Nov 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 36 additions & 3 deletions framework/src/main/java/org/tron/core/Wallet.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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<Account.UnFreezeV2> 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();

Expand All @@ -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<Account.UnFreezeV2> 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());
Expand Down
29 changes: 27 additions & 2 deletions framework/src/main/java/org/tron/core/services/RpcApiService.java
Original file line number Diff line number Diff line change
Expand Up @@ -638,13 +638,25 @@ public void getDelegatedResourceAccountIndexV2(BytesMessage request,
responseObserver.onCompleted();
}

@Override
public void getAvailableUnfreezeCount(GrpcAPI.GetAvailableUnfreezeCountRequestMessage request,
StreamObserver<GrpcAPI.GetAvailableUnfreezeCountResponseMessage> responseObserver) {
try {
responseObserver.onNext(wallet.getAvailableUnfreezeCount(
request.getOwnerAddress()));
} catch (Exception e) {
responseObserver.onError(getRunTimeException(e));
}
responseObserver.onCompleted();
}

@Override
public void getCanWithdrawUnfreezeAmount(CanWithdrawUnfreezeAmountRequestMessage request,
StreamObserver<GrpcAPI.CanWithdrawUnfreezeAmountResponseMessage> responseObserver) {
try {
responseObserver
.onNext(wallet.getCanWithdrawUnfreezeAmount(
request.getOwnerAddress())
request.getOwnerAddress(), request.getTimestamp())
);
} catch (Exception e) {
responseObserver.onError(getRunTimeException(e));
Expand Down Expand Up @@ -2097,13 +2109,26 @@ public void getDelegatedResourceAccountIndexV2(BytesMessage request,
responseObserver.onCompleted();
}

@Override
public void getAvailableUnfreezeCount(GrpcAPI.GetAvailableUnfreezeCountRequestMessage request,
StreamObserver<GrpcAPI.GetAvailableUnfreezeCountResponseMessage> responseObserver) {
try {
responseObserver.onNext(wallet.getAvailableUnfreezeCount(
request.getOwnerAddress()));
} catch (Exception e) {
responseObserver.onError(getRunTimeException(e));
}

responseObserver.onCompleted();
}

@Override
public void getCanWithdrawUnfreezeAmount(CanWithdrawUnfreezeAmountRequestMessage request,
StreamObserver<GrpcAPI.CanWithdrawUnfreezeAmountResponseMessage> responseObserver) {
try {
responseObserver
.onNext(wallet.getCanWithdrawUnfreezeAmount(
request.getOwnerAddress()
request.getOwnerAddress(), request.getTimestamp()
));
} catch (Exception e) {
responseObserver.onError(getRunTimeException(e));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
@@ -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("{}");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 *****
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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),
Expand Down
Original file line number Diff line number Diff line change
@@ -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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -93,6 +94,8 @@ public class HttpApiOnSolidityService implements Service {
@Autowired
private GetDelegatedResourceV2OnSolidityServlet getDelegatedResourceV2OnSolidityServlet;
@Autowired
private GetAvailableUnfreezeCountOnSolidityServlet getAvailableUnfreezeCountOnSolidityServlet;
@Autowired
private GetCanWithdrawUnfreezeAmountOnSolidityServlet
getCanWithdrawUnfreezeAmountOnSolidityServlet;
@Autowired
Expand Down Expand Up @@ -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),
Expand Down
16 changes: 16 additions & 0 deletions protocol/src/main/protos/api/api.proto
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,10 @@ service Wallet {
rpc GetDelegatedResourceAccountIndexV2 (BytesMessage) returns (DelegatedResourceAccountIndex) {
};

rpc GetAvailableUnfreezeCount (GetAvailableUnfreezeCountRequestMessage)
returns (GetAvailableUnfreezeCountResponseMessage) {
};

rpc GetCanWithdrawUnfreezeAmount (CanWithdrawUnfreezeAmountRequestMessage)
returns (CanWithdrawUnfreezeAmountResponseMessage) {
}
Expand Down Expand Up @@ -920,6 +924,10 @@ service WalletSolidity {
rpc GetDelegatedResourceAccountIndexV2 (BytesMessage) returns (DelegatedResourceAccountIndex) {
};

rpc GetAvailableUnfreezeCount (GetAvailableUnfreezeCountRequestMessage)
returns (GetAvailableUnfreezeCountResponseMessage) {
};

rpc GetCanWithdrawUnfreezeAmount (CanWithdrawUnfreezeAmountRequestMessage)
returns (CanWithdrawUnfreezeAmountResponseMessage) {
}
Expand Down Expand Up @@ -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;
Expand Down