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  }