code.vegaprotocol.io/vega@v0.79.0/core/events/referral_set.go (about)

     1  // Copyright (C) 2023 Gobalsky Labs Limited
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15  
    16  package events
    17  
    18  import (
    19  	"context"
    20  	"strings"
    21  
    22  	"code.vegaprotocol.io/vega/core/types"
    23  	"code.vegaprotocol.io/vega/libs/num"
    24  	eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1"
    25  
    26  	"golang.org/x/exp/slices"
    27  )
    28  
    29  type ReferralSetCreated struct {
    30  	*Base
    31  	e eventspb.ReferralSetCreated
    32  }
    33  
    34  func (t ReferralSetCreated) StreamMessage() *eventspb.BusEvent {
    35  	busEvent := newBusEventFromBase(t.Base)
    36  	busEvent.Event = &eventspb.BusEvent_ReferralSetCreated{
    37  		ReferralSetCreated: &t.e,
    38  	}
    39  
    40  	return busEvent
    41  }
    42  
    43  func (t ReferralSetCreated) GetProtoEvent() *eventspb.ReferralSetCreated {
    44  	return &t.e
    45  }
    46  
    47  func NewReferralSetCreatedEvent(ctx context.Context, set *types.ReferralSet) *ReferralSetCreated {
    48  	return &ReferralSetCreated{
    49  		Base: newBase(ctx, ReferralSetCreatedEvent),
    50  		e: eventspb.ReferralSetCreated{
    51  			SetId:     string(set.ID),
    52  			Referrer:  string(set.Referrer.PartyID),
    53  			CreatedAt: set.CreatedAt.UnixNano(),
    54  			UpdatedAt: set.CreatedAt.UnixNano(),
    55  		},
    56  	}
    57  }
    58  
    59  func ReferralSetCreatedEventFromStream(ctx context.Context, be *eventspb.BusEvent) *ReferralSetCreated {
    60  	return &ReferralSetCreated{
    61  		Base: newBaseFromBusEvent(ctx, ReferralSetCreatedEvent, be),
    62  		e:    *be.GetReferralSetCreated(),
    63  	}
    64  }
    65  
    66  type ReferralSetStatsUpdated struct {
    67  	*Base
    68  	e eventspb.ReferralSetStatsUpdated
    69  }
    70  
    71  func (t ReferralSetStatsUpdated) Unwrap() *types.ReferralSetStats {
    72  	volume, _ := num.UintFromString(t.e.ReferralSetRunningNotionalTakerVolume, 10)
    73  	stats := map[types.PartyID]*types.RefereeStats{}
    74  	rewardsMultiplier, _ := num.DecimalFromString(t.e.RewardsMultiplier)
    75  	rewardsFactorsMultiplier := types.FactorsFromRewardFactorsWithDefault(t.e.RewardFactorsMultiplier, t.e.RewardsFactorMultiplier)
    76  	rewardFactors := types.FactorsFromRewardFactorsWithDefault(t.e.RewardFactors, t.e.RewardFactor)
    77  	for _, stat := range t.e.RefereesStats {
    78  		discountFactors := types.FactorsFromDiscountFactorsWithDefault(stat.DiscountFactors, stat.DiscountFactor)
    79  		stats[types.PartyID(stat.PartyId)] = &types.RefereeStats{
    80  			DiscountFactors: discountFactors,
    81  		}
    82  	}
    83  
    84  	return &types.ReferralSetStats{
    85  		AtEpoch:                  t.e.AtEpoch,
    86  		SetID:                    types.ReferralSetID(t.e.SetId),
    87  		WasEligible:              t.e.WasEligible,
    88  		ReferralSetRunningVolume: volume,
    89  		RefereesStats:            stats,
    90  		RewardFactors:            rewardFactors,
    91  		RewardsMultiplier:        rewardsMultiplier,
    92  		RewardsFactorsMultiplier: rewardsFactorsMultiplier,
    93  	}
    94  }
    95  
    96  func (t ReferralSetStatsUpdated) GetProtoEvent() *eventspb.ReferralSetStatsUpdated {
    97  	return &t.e
    98  }
    99  
   100  func (t ReferralSetStatsUpdated) StreamMessage() *eventspb.BusEvent {
   101  	busEvent := newBusEventFromBase(t.Base)
   102  	busEvent.Event = &eventspb.BusEvent_ReferralSetStatsUpdated{
   103  		ReferralSetStatsUpdated: &t.e,
   104  	}
   105  
   106  	return busEvent
   107  }
   108  
   109  func NewReferralSetStatsUpdatedEvent(ctx context.Context, update *types.ReferralSetStats) *ReferralSetStatsUpdated {
   110  	refereesStats := make([]*eventspb.RefereeStats, 0, len(update.RefereesStats))
   111  	for partyID, stat := range update.RefereesStats {
   112  		refereesStats = append(refereesStats, &eventspb.RefereeStats{
   113  			PartyId:                  string(partyID),
   114  			DiscountFactors:          stat.DiscountFactors.IntoDiscountFactorsProto(),
   115  			EpochNotionalTakerVolume: stat.TakerVolume.String(),
   116  		})
   117  	}
   118  
   119  	slices.SortStableFunc(refereesStats, func(a, b *eventspb.RefereeStats) int {
   120  		return strings.Compare(a.PartyId, b.PartyId)
   121  	})
   122  
   123  	return &ReferralSetStatsUpdated{
   124  		Base: newBase(ctx, ReferralSetStatsUpdatedEvent),
   125  		e: eventspb.ReferralSetStatsUpdated{
   126  			SetId:                                 string(update.SetID),
   127  			AtEpoch:                               update.AtEpoch,
   128  			WasEligible:                           update.WasEligible,
   129  			ReferralSetRunningNotionalTakerVolume: update.ReferralSetRunningVolume.String(),
   130  			ReferrerTakerVolume:                   update.ReferrerTakerVolume.String(),
   131  			RefereesStats:                         refereesStats,
   132  			RewardFactors:                         update.RewardFactors.IntoRewardFactorsProto(),
   133  			RewardsMultiplier:                     update.RewardsMultiplier.String(),
   134  			RewardFactorsMultiplier:               update.RewardsFactorsMultiplier.IntoRewardFactorsProto(),
   135  		},
   136  	}
   137  }
   138  
   139  func ReferralSetStatsUpdatedEventFromStream(ctx context.Context, be *eventspb.BusEvent) *ReferralSetStatsUpdated {
   140  	return &ReferralSetStatsUpdated{
   141  		Base: newBaseFromBusEvent(ctx, ReferralSetStatsUpdatedEvent, be),
   142  		e:    *be.GetReferralSetStatsUpdated(),
   143  	}
   144  }
   145  
   146  type RefereeJoinedReferralSet struct {
   147  	*Base
   148  	e eventspb.RefereeJoinedReferralSet
   149  }
   150  
   151  func (t RefereeJoinedReferralSet) StreamMessage() *eventspb.BusEvent {
   152  	busEvent := newBusEventFromBase(t.Base)
   153  	busEvent.Event = &eventspb.BusEvent_RefereeJoinedReferralSet{
   154  		RefereeJoinedReferralSet: &t.e,
   155  	}
   156  
   157  	return busEvent
   158  }
   159  
   160  func (t RefereeJoinedReferralSet) GetProtoEvent() *eventspb.RefereeJoinedReferralSet {
   161  	return &t.e
   162  }
   163  
   164  func NewRefereeJoinedReferralSetEvent(ctx context.Context, setID types.ReferralSetID, membership *types.Membership) *RefereeJoinedReferralSet {
   165  	return &RefereeJoinedReferralSet{
   166  		Base: newBase(ctx, RefereeJoinedReferralSetEvent),
   167  		e: eventspb.RefereeJoinedReferralSet{
   168  			SetId:    string(setID),
   169  			Referee:  string(membership.PartyID),
   170  			JoinedAt: membership.JoinedAt.UnixNano(),
   171  			AtEpoch:  membership.StartedAtEpoch,
   172  		},
   173  	}
   174  }
   175  
   176  func RefereeJoinedReferralSetEventFromStream(ctx context.Context, be *eventspb.BusEvent) *RefereeJoinedReferralSet {
   177  	return &RefereeJoinedReferralSet{
   178  		Base: newBaseFromBusEvent(ctx, RefereeJoinedReferralSetEvent, be),
   179  		e:    *be.GetRefereeJoinedReferralSet(),
   180  	}
   181  }