code.vegaprotocol.io/vega@v0.79.0/datanode/sqlsubscribers/transfers.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 sqlsubscribers
    17  
    18  import (
    19  	"context"
    20  
    21  	"code.vegaprotocol.io/vega/core/events"
    22  	"code.vegaprotocol.io/vega/datanode/entities"
    23  	eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1"
    24  
    25  	"github.com/pkg/errors"
    26  )
    27  
    28  type TransferEvent interface {
    29  	events.Event
    30  	TransferFunds() eventspb.Transfer
    31  }
    32  
    33  type TransferFeesEvent interface {
    34  	events.Event
    35  	TransferFees() eventspb.TransferFees
    36  }
    37  
    38  type TransferFeesDiscountUpdateEvent interface {
    39  	events.Event
    40  	TransferFeesDiscount() eventspb.TransferFeesDiscount
    41  }
    42  
    43  type TransferStore interface {
    44  	Upsert(ctx context.Context, transfer *entities.Transfer) error
    45  	UpsertFees(ctx context.Context, tf *entities.TransferFees) error
    46  	UpsertFeesDiscount(ctx context.Context, tfd *entities.TransferFeesDiscount) error
    47  }
    48  
    49  type AccountSource interface {
    50  	Obtain(ctx context.Context, a *entities.Account) error
    51  	GetByID(ctx context.Context, id entities.AccountID) (entities.Account, error)
    52  }
    53  
    54  type Transfer struct {
    55  	subscriber
    56  	store         TransferStore
    57  	accountSource AccountSource
    58  }
    59  
    60  func NewTransfer(store TransferStore, accountSource AccountSource) *Transfer {
    61  	return &Transfer{
    62  		store:         store,
    63  		accountSource: accountSource,
    64  	}
    65  }
    66  
    67  func (rf *Transfer) Types() []events.Type {
    68  	return []events.Type{
    69  		events.TransferEvent,
    70  		events.TransferFeesEvent,
    71  		events.TransferFeesDiscountUpdatedEvent,
    72  	}
    73  }
    74  
    75  func (rf *Transfer) Push(ctx context.Context, evt events.Event) error {
    76  	switch te := evt.(type) {
    77  	case TransferEvent:
    78  		return rf.consume(ctx, te)
    79  	case TransferFeesEvent:
    80  		return rf.handleFees(ctx, te)
    81  	case TransferFeesDiscountUpdateEvent:
    82  		return rf.handleDiscount(ctx, te)
    83  	}
    84  	return errors.New("unsupported event")
    85  }
    86  
    87  func (rf *Transfer) consume(ctx context.Context, event TransferEvent) error {
    88  	transfer := event.TransferFunds()
    89  	record, err := entities.TransferFromProto(ctx, &transfer, entities.TxHash(event.TxHash()), rf.vegaTime, rf.accountSource)
    90  	if err != nil {
    91  		return errors.Wrap(err, "converting transfer proto to database entity failed")
    92  	}
    93  
    94  	return errors.Wrap(rf.store.Upsert(ctx, record), "inserting transfer into to SQL store failed")
    95  }
    96  
    97  func (rf *Transfer) handleFees(ctx context.Context, e TransferFeesEvent) error {
    98  	tf := e.TransferFees()
    99  	rec := entities.TransferFeesFromProto(&tf, rf.vegaTime)
   100  	return errors.Wrap(rf.store.UpsertFees(ctx, rec), "inserting transfer fee into SQL store failed")
   101  }
   102  
   103  func (rf *Transfer) handleDiscount(ctx context.Context, e TransferFeesDiscountUpdateEvent) error {
   104  	tf := e.TransferFeesDiscount()
   105  	discount := entities.TransferFeesDiscountFromProto(&tf, rf.vegaTime)
   106  	return errors.Wrap(rf.store.UpsertFeesDiscount(ctx, discount), "inserting transfer fee discount update into SQL store failed")
   107  }
   108  
   109  func (rf *Transfer) Name() string {
   110  	return "Transfer"
   111  }