code.vegaprotocol.io/vega@v0.79.0/datanode/entities/ledgerentry.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 entities
    17  
    18  import (
    19  	"context"
    20  	"fmt"
    21  	"time"
    22  
    23  	"code.vegaprotocol.io/vega/libs/ptr"
    24  	"code.vegaprotocol.io/vega/protos/vega"
    25  
    26  	"github.com/jackc/pgtype"
    27  	"github.com/shopspring/decimal"
    28  )
    29  
    30  type LedgerEntry struct {
    31  	LedgerEntryTime    time.Time
    32  	FromAccountID      AccountID `db:"account_from_id"`
    33  	ToAccountID        AccountID `db:"account_to_id"`
    34  	Quantity           decimal.Decimal
    35  	TxHash             TxHash
    36  	VegaTime           time.Time
    37  	TransferTime       time.Time
    38  	Type               LedgerMovementType
    39  	FromAccountBalance decimal.Decimal `db:"account_from_balance"`
    40  	ToAccountBalance   decimal.Decimal `db:"account_to_balance"`
    41  	TransferID         TransferID
    42  }
    43  
    44  var LedgerEntryColumns = []string{
    45  	"ledger_entry_time",
    46  	"account_from_id", "account_to_id", "quantity",
    47  	"tx_hash", "vega_time", "transfer_time", "type",
    48  	"account_from_balance",
    49  	"account_to_balance",
    50  	"transfer_id",
    51  }
    52  
    53  func (le LedgerEntry) ToProto(ctx context.Context, accountSource AccountSource) (*vega.LedgerEntry, error) {
    54  	fromAcc, err := accountSource.GetByID(ctx, le.FromAccountID)
    55  	if err != nil {
    56  		return nil, fmt.Errorf("getting from account for transfer proto:%w", err)
    57  	}
    58  
    59  	toAcc, err := accountSource.GetByID(ctx, le.ToAccountID)
    60  	if err != nil {
    61  		return nil, fmt.Errorf("getting to account for transfer proto:%w", err)
    62  	}
    63  
    64  	var transferID *string
    65  	if le.TransferID != "" {
    66  		transferID = ptr.From(le.TransferID.String())
    67  	}
    68  
    69  	return &vega.LedgerEntry{
    70  		FromAccount:        fromAcc.ToAccountDetailsProto(),
    71  		ToAccount:          toAcc.ToAccountDetailsProto(),
    72  		Amount:             le.Quantity.String(),
    73  		Type:               vega.TransferType(le.Type),
    74  		FromAccountBalance: le.FromAccountBalance.String(),
    75  		ToAccountBalance:   le.ToAccountBalance.String(),
    76  		TransferId:         transferID,
    77  	}, nil
    78  }
    79  
    80  func (le LedgerEntry) ToRow() []any {
    81  	return []any{
    82  		le.LedgerEntryTime,
    83  		le.FromAccountID,
    84  		le.ToAccountID,
    85  		le.Quantity,
    86  		le.TxHash,
    87  		le.VegaTime,
    88  		le.TransferTime,
    89  		le.Type,
    90  		le.FromAccountBalance,
    91  		le.ToAccountBalance,
    92  		le.TransferID,
    93  	}
    94  }
    95  
    96  func CreateLedgerEntryTime(vegaTime time.Time, seqNum int) time.Time {
    97  	return vegaTime.Add(time.Duration(seqNum) * time.Microsecond)
    98  }
    99  
   100  type LedgerMovementType vega.TransferType
   101  
   102  const (
   103  	LedgerMovementTypeUnspecified                 = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_UNSPECIFIED)
   104  	LedgerMovementTypeLoss                        = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_LOSS)
   105  	LedgerMovementTypeWin                         = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_WIN)
   106  	LedgerMovementTypeMTMLoss                     = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_MTM_LOSS)
   107  	LedgerMovementTypeMTMWin                      = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_MTM_WIN)
   108  	LedgerMovementTypeMarginLow                   = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_MARGIN_LOW)
   109  	LedgerMovementTypeMarginHigh                  = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_MARGIN_HIGH)
   110  	LedgerMovementTypeMarginConfiscated           = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_MARGIN_CONFISCATED)
   111  	LedgerMovementTypeMakerFeePay                 = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_MAKER_FEE_PAY)
   112  	LedgerMovementTypeMakerFeeReceive             = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_MAKER_FEE_RECEIVE)
   113  	LedgerMovementTypeInfrastructureFeePay        = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_INFRASTRUCTURE_FEE_PAY)
   114  	LedgerMovementTypeInfrastructureFeeDistribute = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_INFRASTRUCTURE_FEE_DISTRIBUTE)
   115  	LedgerMovementTypeLiquidityFeePay             = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_LIQUIDITY_FEE_PAY)
   116  	LedgerMovementTypeLiquidityFeeDistribute      = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_LIQUIDITY_FEE_DISTRIBUTE)
   117  	LedgerMovementTypeBondLow                     = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_BOND_LOW)
   118  	LedgerMovementTypeBondHigh                    = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_BOND_HIGH)
   119  	LedgerMovementTypeWithdraw                    = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_WITHDRAW)
   120  	LedgerMovementTypeDeposit                     = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_DEPOSIT)
   121  	LedgerMovementTypeBondSlashing                = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_BOND_SLASHING)
   122  	LedgerMovementTypeRewardPayout                = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_REWARD_PAYOUT)
   123  	LedgerMovementTypeTransferFundsSend           = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_TRANSFER_FUNDS_SEND)
   124  	LedgerMovementTypeTransferFundsDistribute     = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_TRANSFER_FUNDS_DISTRIBUTE)
   125  	LedgerMovementTypeClearAccount                = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_CLEAR_ACCOUNT)
   126  	LedgerMovementTypePerpFundingWin              = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_PERPETUALS_FUNDING_WIN)
   127  	LedgerMovementTypePerpFundingLoss             = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_PERPETUALS_FUNDING_LOSS)
   128  	LedgerMovementTypeRewardsVested               = LedgerMovementType(vega.TransferType_TRANSFER_TYPE_REWARDS_VESTED)
   129  )
   130  
   131  func (l LedgerMovementType) EncodeText(_ *pgtype.ConnInfo, buf []byte) ([]byte, error) {
   132  	ty, ok := vega.TransferType_name[int32(l)]
   133  	if !ok {
   134  		return buf, fmt.Errorf("unknown ledger movement type: %s", ty)
   135  	}
   136  	return append(buf, []byte(ty)...), nil
   137  }
   138  
   139  func (l *LedgerMovementType) DecodeText(_ *pgtype.ConnInfo, src []byte) error {
   140  	val, ok := vega.TransferType_value[string(src)]
   141  	if !ok {
   142  		return fmt.Errorf("unknown ledger movement type: %s", src)
   143  	}
   144  
   145  	*l = LedgerMovementType(val)
   146  	return nil
   147  }