github.com/ava-labs/avalanchego@v1.11.11/wallet/chain/x/backend.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package x
     5  
     6  import (
     7  	"context"
     8  
     9  	"github.com/ava-labs/avalanchego/vms/avm/txs"
    10  	"github.com/ava-labs/avalanchego/wallet/chain/x/builder"
    11  	"github.com/ava-labs/avalanchego/wallet/chain/x/signer"
    12  	"github.com/ava-labs/avalanchego/wallet/subnet/primary/common"
    13  )
    14  
    15  var _ Backend = (*backend)(nil)
    16  
    17  // Backend defines the full interface required to support an X-chain wallet.
    18  type Backend interface {
    19  	common.ChainUTXOs
    20  	builder.Backend
    21  	signer.Backend
    22  
    23  	AcceptTx(ctx context.Context, tx *txs.Tx) error
    24  }
    25  
    26  type backend struct {
    27  	common.ChainUTXOs
    28  
    29  	context *builder.Context
    30  }
    31  
    32  func NewBackend(context *builder.Context, utxos common.ChainUTXOs) Backend {
    33  	return &backend{
    34  		ChainUTXOs: utxos,
    35  		context:    context,
    36  	}
    37  }
    38  
    39  func (b *backend) AcceptTx(ctx context.Context, tx *txs.Tx) error {
    40  	err := tx.Unsigned.Visit(&backendVisitor{
    41  		b:    b,
    42  		ctx:  ctx,
    43  		txID: tx.ID(),
    44  	})
    45  	if err != nil {
    46  		return err
    47  	}
    48  
    49  	chainID := b.context.BlockchainID
    50  	inputUTXOs := tx.Unsigned.InputUTXOs()
    51  	for _, utxoID := range inputUTXOs {
    52  		if utxoID.Symbol {
    53  			continue
    54  		}
    55  		if err := b.RemoveUTXO(ctx, chainID, utxoID.InputID()); err != nil {
    56  			return err
    57  		}
    58  	}
    59  
    60  	outputUTXOs := tx.UTXOs()
    61  	for _, utxo := range outputUTXOs {
    62  		if err := b.AddUTXO(ctx, chainID, utxo); err != nil {
    63  			return err
    64  		}
    65  	}
    66  	return nil
    67  }