diff --git a/p2p/pkg/rpc/provider/service.go b/p2p/pkg/rpc/provider/service.go index 713e5ba57..44906860e 100644 --- a/p2p/pkg/rpc/provider/service.go +++ b/p2p/pkg/rpc/provider/service.go @@ -100,6 +100,57 @@ type CommitmentStore interface { type OptsGetter func(ctx context.Context) (*bind.TransactOpts, error) +func decodeBidOptions(bidOptionsBytes []byte) (*providerapiv1.BidOptions, error) { + if len(bidOptionsBytes) == 0 { + return nil, nil + } + + bidderOpts := new(bidderapiv1.BidOptions) + if err := proto.Unmarshal(bidOptionsBytes, bidderOpts); err != nil { + return nil, fmt.Errorf("unmarshalling bid options: %w", err) + } + + return translateBidOptions(bidderOpts), nil +} + +func translateBidOptions(bidderOpts *bidderapiv1.BidOptions) *providerapiv1.BidOptions { + if bidderOpts == nil { + return nil + } + + opts := &providerapiv1.BidOptions{} + for _, bOpt := range bidderOpts.Options { + switch { + case bOpt.GetPositionConstraint() != nil: + c := bOpt.GetPositionConstraint() + opt := &providerapiv1.BidOption{ + Opt: &providerapiv1.BidOption_PositionConstraint{ + PositionConstraint: &providerapiv1.PositionConstraint{ + Anchor: providerapiv1.PositionConstraint_Anchor(c.GetAnchor()), + Basis: providerapiv1.PositionConstraint_Basis(c.GetBasis()), + Value: c.GetValue(), + }, + }, + } + opts.Options = append(opts.Options, opt) + case bOpt.GetShutterisedBidOption() != nil: + c := bOpt.GetShutterisedBidOption() + opt := &providerapiv1.BidOption{ + Opt: &providerapiv1.BidOption_ShutterisedBidOption{ + ShutterisedBidOption: &providerapiv1.ShutterisedBidOption{ + IdentityPrefix: c.GetIdentityPrefix(), + EncryptedTx: c.GetEncryptedTx(), + EonId: c.GetEonId(), + }, + }, + } + opts.Options = append(opts.Options, opt) + } + } + + return opts +} + func NewService( logger *slog.Logger, registryContract ProviderRegistryContract, @@ -146,41 +197,9 @@ func (s *Service) ProcessBid( if bid.RevertingTxHashes != "" { revertingTxnHashes = strings.Split(bid.RevertingTxHashes, ",") } - var opts *providerapiv1.BidOptions - if bid.BidOptions != nil { - bidderOpts := new(bidderapiv1.BidOptions) - if err := proto.Unmarshal(bid.BidOptions, bidderOpts); err != nil { - return nil, fmt.Errorf("unmarshalling bid options: %w", err) - } - opts = new(providerapiv1.BidOptions) - for _, bOpt := range bidderOpts.Options { - switch { - case bOpt.GetPositionConstraint() != nil: - c := bOpt.GetPositionConstraint() - opt := &providerapiv1.BidOption{ - Opt: &providerapiv1.BidOption_PositionConstraint{ - PositionConstraint: &providerapiv1.PositionConstraint{ - Anchor: providerapiv1.PositionConstraint_Anchor(c.GetAnchor()), - Basis: providerapiv1.PositionConstraint_Basis(c.GetBasis()), - Value: c.GetValue(), - }, - }, - } - opts.Options = append(opts.Options, opt) - case bOpt.GetShutterisedBidOption() != nil: - c := bOpt.GetShutterisedBidOption() - opt := &providerapiv1.BidOption{ - Opt: &providerapiv1.BidOption_ShutterisedBidOption{ - ShutterisedBidOption: &providerapiv1.ShutterisedBidOption{ - IdentityPrefix: c.GetIdentityPrefix(), - EncryptedTx: c.GetEncryptedTx(), - EonId: c.GetEonId(), - }, - }, - } - opts.Options = append(opts.Options, opt) - } - } + opts, err := decodeBidOptions(bid.BidOptions) + if err != nil { + return nil, err } bidMsg := &providerapiv1.Bid{ TxHashes: strings.Split(bid.TxHash, ","), @@ -196,8 +215,7 @@ func (s *Service) ProcessBid( BidderAddress: bidderAddr.Hex(), } - err := s.validator.Validate(bidMsg) - if err != nil { + if err = s.validator.Validate(bidMsg); err != nil { return nil, err } @@ -603,6 +621,16 @@ func (s *Service) GetCommitmentInfo( blockCommitments := make([]*providerapiv1.CommitmentInfoResponse_BlockCommitments, 0) for _, c := range cmts { + revertableTxnHashes := make([]string, 0) + if c.Bid.RevertingTxHashes != "" { + revertableTxnHashes = strings.Split(c.Bid.RevertingTxHashes, ",") + } + + bidOpts, err := decodeBidOptions(c.Bid.BidOptions) + if err != nil { + return nil, status.Errorf(codes.Internal, "decoding bid options: %v", err) + } + if len(blockCommitments) == 0 || blockCommitments[len(blockCommitments)-1].BlockNumber != c.Bid.BlockNumber { blockCommitments = append(blockCommitments, &providerapiv1.CommitmentInfoResponse_BlockCommitments{ BlockNumber: c.Bid.BlockNumber, @@ -611,7 +639,7 @@ func (s *Service) GetCommitmentInfo( } blockCommitments[len(blockCommitments)-1].Commitments = append(blockCommitments[len(blockCommitments)-1].Commitments, &providerapiv1.CommitmentInfoResponse_Commitment{ TxnHashes: strings.Split(c.Bid.TxHash, ","), - RevertableTxnHashes: strings.Split(c.Bid.RevertingTxHashes, ","), + RevertableTxnHashes: revertableTxnHashes, Amount: c.Bid.BidAmount, BlockNumber: c.Bid.BlockNumber, ProviderAddress: common.Bytes2Hex(c.ProviderAddress), @@ -623,6 +651,7 @@ func (s *Service) GetCommitmentInfo( Details: c.Details, Payment: c.Payment, Refund: c.Refund, + BidOptions: bidOpts, }) } diff --git a/p2p/pkg/rpc/provider/service_test.go b/p2p/pkg/rpc/provider/service_test.go index 961eb3d73..dd60ecc0d 100644 --- a/p2p/pkg/rpc/provider/service_test.go +++ b/p2p/pkg/rpc/provider/service_test.go @@ -678,6 +678,35 @@ func TestGetCommitmentInfo(t *testing.T) { t.Run("get commitment info", func(t *testing.T) { // Create a test commitment + identityPrefix := strings.Repeat("ab", 32) + encryptedTx := strings.Repeat("cd", 32) + bidderOpts := &bidderapiv1.BidOptions{ + Options: []*bidderapiv1.BidOption{ + { + Opt: &bidderapiv1.BidOption_PositionConstraint{ + PositionConstraint: &bidderapiv1.PositionConstraint{ + Anchor: bidderapiv1.PositionConstraint_ANCHOR_TOP, + Basis: bidderapiv1.PositionConstraint_BASIS_PERCENTILE, + Value: 5, + }, + }, + }, + { + Opt: &bidderapiv1.BidOption_ShutterisedBidOption{ + ShutterisedBidOption: &bidderapiv1.ShutterisedBidOption{ + IdentityPrefix: identityPrefix, + EncryptedTx: encryptedTx, + EonId: 7, + }, + }, + }, + }, + } + bidOptionsBytes, marshalErr := proto.Marshal(bidderOpts) + if marshalErr != nil { + t.Fatalf("error marshaling bid options: %v", marshalErr) + } + testCommitment := &preconfstore.Commitment{ EncryptedPreConfirmation: &preconfpb.EncryptedPreConfirmation{ DispatchTimestamp: 123456889, @@ -689,6 +718,8 @@ func TestGetCommitmentInfo(t *testing.T) { BidAmount: "1000000000000000000", DecayStartTimestamp: 123456789, DecayEndTimestamp: 123457896, + RevertingTxHashes: "", + BidOptions: bidOptionsBytes, }, ProviderAddress: common.HexToAddress("0x1234").Bytes(), }, @@ -749,6 +780,32 @@ func TestGetCommitmentInfo(t *testing.T) { if resp.Commitments[0].Commitments[0].Refund != "100000000000000000" { t.Fatalf("expected refund to be 100000000000000000, got %s", resp.Commitments[0].Commitments[0].Refund) } + if len(resp.Commitments[0].Commitments[0].RevertableTxnHashes) != 0 { + t.Fatalf("expected no revertable txn hashes, got %v", resp.Commitments[0].Commitments[0].RevertableTxnHashes) + } + if resp.Commitments[0].Commitments[0].BidOptions == nil { + t.Fatalf("expected bid options to be present") + } + if len(resp.Commitments[0].Commitments[0].BidOptions.Options) != 2 { + t.Fatalf("expected 2 bid options, got %d", len(resp.Commitments[0].Commitments[0].BidOptions.Options)) + } + positionOpt := resp.Commitments[0].Commitments[0].BidOptions.Options[0].GetPositionConstraint() + if positionOpt == nil || positionOpt.Value != 5 { + t.Fatalf("expected position constraint value 5, got %+v", positionOpt) + } + if positionOpt == nil || positionOpt.Anchor != providerapiv1.PositionConstraint_ANCHOR_TOP { + t.Fatalf("expected position constraint anchor TOP, got %+v", positionOpt) + } + shutterOpt := resp.Commitments[0].Commitments[0].BidOptions.Options[1].GetShutterisedBidOption() + if shutterOpt == nil { + t.Fatalf("expected shutterised option to be present") + } + if shutterOpt.IdentityPrefix != identityPrefix { + t.Fatalf("expected identity prefix %s, got %s", identityPrefix, shutterOpt.IdentityPrefix) + } + if shutterOpt.EncryptedTx != encryptedTx { + t.Fatalf("expected encrypted tx %s, got %s", encryptedTx, shutterOpt.EncryptedTx) + } }) t.Run("get all commitments", func(t *testing.T) {