Skip to content
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
105 changes: 67 additions & 38 deletions p2p/pkg/rpc/provider/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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, ","),
Expand All @@ -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
}

Expand Down Expand Up @@ -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,
Expand All @@ -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),
Expand All @@ -623,6 +651,7 @@ func (s *Service) GetCommitmentInfo(
Details: c.Details,
Payment: c.Payment,
Refund: c.Refund,
BidOptions: bidOpts,
})
}

Expand Down
57 changes: 57 additions & 0 deletions p2p/pkg/rpc/provider/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -689,6 +718,8 @@ func TestGetCommitmentInfo(t *testing.T) {
BidAmount: "1000000000000000000",
DecayStartTimestamp: 123456789,
DecayEndTimestamp: 123457896,
RevertingTxHashes: "",
BidOptions: bidOptionsBytes,
},
ProviderAddress: common.HexToAddress("0x1234").Bytes(),
},
Expand Down Expand Up @@ -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) {
Expand Down
Loading