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 }