github.com/MetalBlockchain/metalgo@v1.11.9/wallet/chain/p/backend_visitor.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package p
     5  
     6  import (
     7  	"context"
     8  	"errors"
     9  
    10  	"github.com/MetalBlockchain/metalgo/ids"
    11  	"github.com/MetalBlockchain/metalgo/utils/constants"
    12  	"github.com/MetalBlockchain/metalgo/vms/components/avax"
    13  	"github.com/MetalBlockchain/metalgo/vms/platformvm/txs"
    14  )
    15  
    16  var (
    17  	_ txs.Visitor = (*backendVisitor)(nil)
    18  
    19  	ErrUnsupportedTxType = errors.New("unsupported tx type")
    20  )
    21  
    22  // backendVisitor handles accepting of transactions for the backend
    23  type backendVisitor struct {
    24  	b    *backend
    25  	ctx  context.Context
    26  	txID ids.ID
    27  }
    28  
    29  func (*backendVisitor) AdvanceTimeTx(*txs.AdvanceTimeTx) error {
    30  	return ErrUnsupportedTxType
    31  }
    32  
    33  func (*backendVisitor) RewardValidatorTx(*txs.RewardValidatorTx) error {
    34  	return ErrUnsupportedTxType
    35  }
    36  
    37  func (b *backendVisitor) AddValidatorTx(tx *txs.AddValidatorTx) error {
    38  	return b.baseTx(&tx.BaseTx)
    39  }
    40  
    41  func (b *backendVisitor) AddSubnetValidatorTx(tx *txs.AddSubnetValidatorTx) error {
    42  	return b.baseTx(&tx.BaseTx)
    43  }
    44  
    45  func (b *backendVisitor) AddDelegatorTx(tx *txs.AddDelegatorTx) error {
    46  	return b.baseTx(&tx.BaseTx)
    47  }
    48  
    49  func (b *backendVisitor) CreateChainTx(tx *txs.CreateChainTx) error {
    50  	return b.baseTx(&tx.BaseTx)
    51  }
    52  
    53  func (b *backendVisitor) CreateSubnetTx(tx *txs.CreateSubnetTx) error {
    54  	b.b.setSubnetOwner(
    55  		b.txID,
    56  		tx.Owner,
    57  	)
    58  	return b.baseTx(&tx.BaseTx)
    59  }
    60  
    61  func (b *backendVisitor) RemoveSubnetValidatorTx(tx *txs.RemoveSubnetValidatorTx) error {
    62  	return b.baseTx(&tx.BaseTx)
    63  }
    64  
    65  func (b *backendVisitor) TransferSubnetOwnershipTx(tx *txs.TransferSubnetOwnershipTx) error {
    66  	b.b.setSubnetOwner(
    67  		tx.Subnet,
    68  		tx.Owner,
    69  	)
    70  	return b.baseTx(&tx.BaseTx)
    71  }
    72  
    73  func (b *backendVisitor) BaseTx(tx *txs.BaseTx) error {
    74  	return b.baseTx(tx)
    75  }
    76  
    77  func (b *backendVisitor) ImportTx(tx *txs.ImportTx) error {
    78  	err := b.b.removeUTXOs(
    79  		b.ctx,
    80  		tx.SourceChain,
    81  		tx.InputUTXOs(),
    82  	)
    83  	if err != nil {
    84  		return err
    85  	}
    86  	return b.baseTx(&tx.BaseTx)
    87  }
    88  
    89  func (b *backendVisitor) ExportTx(tx *txs.ExportTx) error {
    90  	for i, out := range tx.ExportedOutputs {
    91  		err := b.b.AddUTXO(
    92  			b.ctx,
    93  			tx.DestinationChain,
    94  			&avax.UTXO{
    95  				UTXOID: avax.UTXOID{
    96  					TxID:        b.txID,
    97  					OutputIndex: uint32(len(tx.Outs) + i),
    98  				},
    99  				Asset: avax.Asset{ID: out.AssetID()},
   100  				Out:   out.Out,
   101  			},
   102  		)
   103  		if err != nil {
   104  			return err
   105  		}
   106  	}
   107  	return b.baseTx(&tx.BaseTx)
   108  }
   109  
   110  func (b *backendVisitor) TransformSubnetTx(tx *txs.TransformSubnetTx) error {
   111  	return b.baseTx(&tx.BaseTx)
   112  }
   113  
   114  func (b *backendVisitor) AddPermissionlessValidatorTx(tx *txs.AddPermissionlessValidatorTx) error {
   115  	return b.baseTx(&tx.BaseTx)
   116  }
   117  
   118  func (b *backendVisitor) AddPermissionlessDelegatorTx(tx *txs.AddPermissionlessDelegatorTx) error {
   119  	return b.baseTx(&tx.BaseTx)
   120  }
   121  
   122  func (b *backendVisitor) baseTx(tx *txs.BaseTx) error {
   123  	return b.b.removeUTXOs(
   124  		b.ctx,
   125  		constants.PlatformChainID,
   126  		tx.InputIDs(),
   127  	)
   128  }