code.vegaprotocol.io/vega@v0.79.0/datanode/sqlstore/erc20_multisig_event.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 sqlstore 17 18 import ( 19 "context" 20 "fmt" 21 "strings" 22 23 "code.vegaprotocol.io/vega/datanode/entities" 24 "code.vegaprotocol.io/vega/datanode/metrics" 25 v2 "code.vegaprotocol.io/vega/protos/data-node/api/v2" 26 27 "github.com/georgysavva/scany/pgxscan" 28 ) 29 30 var erc20MultSigSignerOrdering = TableOrdering{ 31 ColumnOrdering{Name: "vega_time", Sorting: ASC}, 32 ColumnOrdering{Name: "id", Sorting: ASC}, 33 } 34 35 type ERC20MultiSigSignerEvent struct { 36 *ConnectionSource 37 } 38 39 func NewERC20MultiSigSignerEvent(connectionSource *ConnectionSource) *ERC20MultiSigSignerEvent { 40 return &ERC20MultiSigSignerEvent{ 41 ConnectionSource: connectionSource, 42 } 43 } 44 45 func (m *ERC20MultiSigSignerEvent) Add(ctx context.Context, e *entities.ERC20MultiSigSignerEvent) error { 46 defer metrics.StartSQLQuery("ERC20MultiSigSignerEvent", "Add")() 47 query := `INSERT INTO erc20_multisig_signer_events (id, validator_id, signer_change, submitter, nonce, event, tx_hash, vega_time, epoch_id, chain_id) 48 VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) 49 ON CONFLICT (id) DO NOTHING` 50 51 if _, err := m.Exec(ctx, query, 52 e.ID, 53 e.ValidatorID, 54 e.SignerChange, 55 e.Submitter, 56 e.Nonce, 57 e.Event, 58 e.TxHash, 59 e.VegaTime, 60 e.EpochID, 61 e.ChainID, 62 ); err != nil { 63 err = fmt.Errorf("could not insert multisig-signer-events into database: %w", err) 64 return err 65 } 66 67 return nil 68 } 69 70 func (m *ERC20MultiSigSignerEvent) GetAddedEvents(ctx context.Context, validatorID string, submitter string, epochID *int64, chainID *string, pagination entities.CursorPagination) ( 71 []entities.ERC20MultiSigSignerEvent, entities.PageInfo, error, 72 ) { 73 var pageInfo entities.PageInfo 74 out := []entities.ERC20MultiSigSignerAddedEvent{} 75 76 var args []interface{} 77 78 conditions := []string{} 79 if validatorID != "" { 80 conditions = append(conditions, fmt.Sprintf("validator_id=%s", nextBindVar(&args, entities.NodeID(validatorID)))) 81 } 82 83 if submitter != "" { 84 conditions = append(conditions, fmt.Sprintf("submitter=%s", nextBindVar(&args, entities.EthereumAddress(submitter)))) 85 } 86 87 if epochID != nil { 88 conditions = append(conditions, fmt.Sprintf("epoch_id=%s", nextBindVar(&args, *epochID))) 89 } 90 91 if chainID != nil { 92 conditions = append(conditions, fmt.Sprintf("chain_id=%s", nextBindVar(&args, *chainID))) 93 } 94 95 conditions = append(conditions, fmt.Sprintf("event=%s", nextBindVar(&args, entities.ERC20MultiSigSignerEventTypeAdded))) 96 97 query := `SELECT * FROM erc20_multisig_signer_events` 98 if len(conditions) > 0 { 99 query = fmt.Sprintf("%s WHERE %s", query, strings.Join(conditions, " AND ")) 100 } 101 102 query, args, err := PaginateQuery[entities.ERC20MultiSigSignerEventCursor](query, args, erc20MultSigSignerOrdering, pagination) 103 if err != nil { 104 return nil, pageInfo, err 105 } 106 107 defer metrics.StartSQLQuery("ERC20MultiSigSignerEvent", "GetAddedEvents")() 108 if err = pgxscan.Select(ctx, m.ConnectionSource, &out, query, args...); err != nil { 109 return nil, pageInfo, fmt.Errorf("failed to retrieve multisig signer events: %w", err) 110 } 111 112 out, pageInfo = entities.PageEntities[*v2.ERC20MultiSigSignerAddedEdge](out, pagination) 113 114 events := make([]entities.ERC20MultiSigSignerEvent, len(out)) 115 for i, e := range out { 116 events[i] = entities.ERC20MultiSigSignerEvent{ 117 ID: e.ID, 118 ValidatorID: e.ValidatorID, 119 SignerChange: e.SignerChange, 120 Submitter: e.Submitter, 121 Nonce: e.Nonce, 122 VegaTime: e.VegaTime, 123 TxHash: e.TxHash, 124 EpochID: e.EpochID, 125 Event: e.Event, 126 ChainID: e.ChainID, 127 } 128 } 129 return events, pageInfo, nil 130 } 131 132 func (m *ERC20MultiSigSignerEvent) GetRemovedEvents(ctx context.Context, validatorID string, submitter string, epochID *int64, chainID *string, pagination entities.CursorPagination) ([]entities.ERC20MultiSigSignerEvent, entities.PageInfo, error) { 133 var pageInfo entities.PageInfo 134 var err error 135 out := []entities.ERC20MultiSigSignerRemovedEvent{} 136 var args []interface{} 137 138 conditions := []string{} 139 if validatorID != "" { 140 conditions = append(conditions, fmt.Sprintf("validator_id=%s", nextBindVar(&args, entities.NodeID(validatorID)))) 141 } 142 143 if submitter != "" { 144 conditions = append(conditions, fmt.Sprintf("submitter=%s", nextBindVar(&args, entities.EthereumAddress(submitter)))) 145 } 146 147 if epochID != nil { 148 conditions = append(conditions, fmt.Sprintf("epoch_id=%s", nextBindVar(&args, *epochID))) 149 } 150 151 if chainID != nil { 152 conditions = append(conditions, fmt.Sprintf("chain_id=%s", nextBindVar(&args, *chainID))) 153 } 154 155 conditions = append(conditions, fmt.Sprintf("event=%s", nextBindVar(&args, entities.ERC20MultiSigSignerEventTypeRemoved))) 156 157 query := `SELECT * FROM erc20_multisig_signer_events` 158 if len(conditions) > 0 { 159 query = fmt.Sprintf("%s WHERE %s", query, strings.Join(conditions, " AND ")) 160 } 161 162 query, args, err = PaginateQuery[entities.ERC20MultiSigSignerEventCursor](query, args, erc20MultSigSignerOrdering, pagination) 163 if err != nil { 164 return nil, pageInfo, err 165 } 166 167 defer metrics.StartSQLQuery("ERC20MultiSigSignerEvent", "GetRemovedEvents")() 168 if err = pgxscan.Select(ctx, m.ConnectionSource, &out, query, args...); err != nil { 169 return nil, pageInfo, fmt.Errorf("failed to retrieve multisig signer events: %w", err) 170 } 171 172 out, pageInfo = entities.PageEntities[*v2.ERC20MultiSigSignerRemovedEdge](out, pagination) 173 174 events := make([]entities.ERC20MultiSigSignerEvent, len(out)) 175 for i, e := range out { 176 events[i] = entities.ERC20MultiSigSignerEvent{ 177 ID: e.ID, 178 ValidatorID: e.ValidatorID, 179 SignerChange: e.SignerChange, 180 Submitter: e.Submitter, 181 Nonce: e.Nonce, 182 TxHash: e.TxHash, 183 VegaTime: e.VegaTime, 184 EpochID: e.EpochID, 185 Event: e.Event, 186 ChainID: e.ChainID, 187 } 188 } 189 return events, pageInfo, nil 190 } 191 192 func (m *ERC20MultiSigSignerEvent) GetRemovedByTxHash(ctx context.Context, txHash entities.TxHash) ([]entities.ERC20MultiSigSignerRemovedEvent, error) { 193 defer metrics.StartSQLQuery("ERC20MultiSigSignerEvent", "GetRemovedByTxHash")() 194 195 var events []entities.ERC20MultiSigSignerRemovedEvent 196 query := `SELECT * FROM erc20_multisig_signer_events WHERE event=$1 AND tx_hash = $2` 197 198 if err := pgxscan.Select(ctx, m.ConnectionSource, &events, query, entities.ERC20MultiSigSignerEventTypeRemoved, txHash); err != nil { 199 return nil, fmt.Errorf("failed to retrieve multisig removed signer events: %w", err) 200 } 201 202 return events, nil 203 } 204 205 func (m *ERC20MultiSigSignerEvent) GetAddedByTxHash(ctx context.Context, txHash entities.TxHash) ([]entities.ERC20MultiSigSignerAddedEvent, error) { 206 defer metrics.StartSQLQuery("ERC20MultiSigSignerEvent", "GetAddedByTxHash")() 207 208 var events []entities.ERC20MultiSigSignerAddedEvent 209 query := `SELECT * FROM erc20_multisig_signer_events WHERE event=$1 AND tx_hash = $2` 210 211 if err := pgxscan.Select(ctx, m.ConnectionSource, &events, query, entities.ERC20MultiSigSignerEventTypeAdded, txHash); err != nil { 212 return nil, fmt.Errorf("failed to retrieve multisig added signer events: %w", err) 213 } 214 215 return events, nil 216 }