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

Add fee processment status and process it later #1866

Merged
merged 11 commits into from
Oct 19, 2020
63 changes: 63 additions & 0 deletions internal/rpc/rpcserver/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -3613,3 +3613,66 @@ func (s *walletServer) GetPeerInfo(ctx context.Context, req *pb.GetPeerInfoReque
PeerInfo: infos,
}, nil
}

func (s *walletServer) GetVSPTicketsByFeeStatus(ctx context.Context, req *pb.GetVSPTicketsByFeeStatusRequest) (
*pb.GetVSPTicketsByFeeStatusResponse, error) {

var feeStatus int
switch req.FeeStatus {
case pb.GetVSPTicketsByFeeStatusRequest_VSP_FEE_PROCESS_STARTED:
feeStatus = int(udb.VSPFeeProcessStarted)
case pb.GetVSPTicketsByFeeStatusRequest_VSP_FEE_PROCESS_PAID:
feeStatus = int(udb.VSPFeeProcessPaid)
case pb.GetVSPTicketsByFeeStatusRequest_VSP_FEE_PROCESS_ERRORED:
feeStatus = int(udb.VSPFeeProcessErrored)
default:
return nil, status.Errorf(codes.InvalidArgument, "fee status=%v", req.FeeStatus)
}

failedTicketsFee, err := s.wallet.GetVSPTicketsByFeeStatus(ctx, feeStatus)
if err != nil {
return nil, err
}

hashes := make([][]byte, len(failedTicketsFee))
for i, hash := range failedTicketsFee {
hashes[i] = hash[:]
}

return &pb.GetVSPTicketsByFeeStatusResponse{
TicketsHashes: hashes,
}, nil
}

func (s *walletServer) SyncVSPFailedTickets(ctx context.Context, req *pb.SyncVSPTicketsRequest) (
*pb.SyncVSPTicketsResponse, error) {
failedTicketsFee, err := s.wallet.GetVSPTicketsByFeeStatus(ctx, int(udb.VSPFeeProcessErrored))
if err != nil {
return nil, err
}

vspHost := req.VspHost
vspPubKey := req.VspPubkey
if vspPubKey == "" {
return nil, status.Errorf(codes.InvalidArgument, "vsp pubkey can not be null")
}
if vspHost == "" {
return nil, status.Errorf(codes.InvalidArgument, "vsp host can not be null")
}
vspServer, err := vsp.New(
vspHost, vspPubKey, req.Account, req.Account, nil, s.wallet, s.wallet.ChainParams())
if err != nil {
return nil, status.Errorf(codes.Unknown, "TicketBuyerV3 instance failed to start. Error: %v", err)
}

// process tickets fee if needed.
for _, ticketHash := range failedTicketsFee {
_, err := vspServer.Process(ctx, ticketHash, nil)
// if it fails to process again, we log it and continue with
// the wallet start.
if err != nil {
return nil, err
}
}
return &pb.SyncVSPTicketsResponse{}, nil
}
23 changes: 23 additions & 0 deletions rpc/api.proto
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ service WalletService {
rpc LockAccount (LockAccountRequest) returns (LockAccountResponse);
rpc UnlockWallet (UnlockWalletRequest) returns (UnlockWalletResponse);
rpc LockWallet (LockWalletRequest) returns (LockWalletResponse);
rpc SyncVSPFailedTickets(SyncVSPTicketsRequest) returns (SyncVSPTicketsResponse);
rpc GetVSPTicketsByFeeStatus (GetVSPTicketsByFeeStatusRequest) returns (GetVSPTicketsByFeeStatusResponse);
}

service WalletLoaderService {
Expand Down Expand Up @@ -1244,3 +1246,24 @@ message GetPeerInfoResponse {
}
repeated PeerInfo peer_info = 1;
}

message SyncVSPTicketsRequest {
string vsp_host = 1;
string vsp_pubkey = 2;
uint32 account = 3;
}

message SyncVSPTicketsResponse {}

message GetVSPTicketsByFeeStatusRequest {
enum FeeStatus {
VSP_FEE_PROCESS_STARTED = 0;
VSP_FEE_PROCESS_PAID = 1;
VSP_FEE_PROCESS_ERRORED = 2;
}
jrick marked this conversation as resolved.
Show resolved Hide resolved
FeeStatus fee_status = 3;
}

message GetVSPTicketsByFeeStatusResponse {
repeated bytes tickets_hashes = 1;
}
Loading