github.com/ava-labs/avalanchego@v1.11.11/vms/avm/txs/txstest/utxos.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package txstest
     5  
     6  import (
     7  	"context"
     8  	"fmt"
     9  
    10  	"github.com/ava-labs/avalanchego/chains/atomic"
    11  	"github.com/ava-labs/avalanchego/codec"
    12  	"github.com/ava-labs/avalanchego/database"
    13  	"github.com/ava-labs/avalanchego/ids"
    14  	"github.com/ava-labs/avalanchego/snow"
    15  	"github.com/ava-labs/avalanchego/utils/set"
    16  	"github.com/ava-labs/avalanchego/vms/avm/state"
    17  	"github.com/ava-labs/avalanchego/vms/components/avax"
    18  	"github.com/ava-labs/avalanchego/wallet/chain/x/builder"
    19  	"github.com/ava-labs/avalanchego/wallet/chain/x/signer"
    20  )
    21  
    22  const maxPageSize uint64 = 1024
    23  
    24  var (
    25  	_ builder.Backend = (*walletUTXOsAdapter)(nil)
    26  	_ signer.Backend  = (*walletUTXOsAdapter)(nil)
    27  )
    28  
    29  func newUTXOs(
    30  	ctx *snow.Context,
    31  	state state.State,
    32  	sharedMemory atomic.SharedMemory,
    33  	codec codec.Manager,
    34  ) *utxos {
    35  	return &utxos{
    36  		xchainID:     ctx.ChainID,
    37  		state:        state,
    38  		sharedMemory: sharedMemory,
    39  		codec:        codec,
    40  	}
    41  }
    42  
    43  type utxos struct {
    44  	xchainID     ids.ID
    45  	state        state.State
    46  	sharedMemory atomic.SharedMemory
    47  	codec        codec.Manager
    48  }
    49  
    50  func (u *utxos) UTXOs(addrs set.Set[ids.ShortID], sourceChainID ids.ID) ([]*avax.UTXO, error) {
    51  	if sourceChainID == u.xchainID {
    52  		return avax.GetAllUTXOs(u.state, addrs)
    53  	}
    54  
    55  	atomicUTXOs, _, _, err := avax.GetAtomicUTXOs(
    56  		u.sharedMemory,
    57  		u.codec,
    58  		sourceChainID,
    59  		addrs,
    60  		ids.ShortEmpty,
    61  		ids.Empty,
    62  		int(maxPageSize),
    63  	)
    64  	return atomicUTXOs, err
    65  }
    66  
    67  func (u *utxos) GetUTXO(addrs set.Set[ids.ShortID], chainID, utxoID ids.ID) (*avax.UTXO, error) {
    68  	if chainID == u.xchainID {
    69  		return u.state.GetUTXO(utxoID)
    70  	}
    71  
    72  	atomicUTXOs, _, _, err := avax.GetAtomicUTXOs(
    73  		u.sharedMemory,
    74  		u.codec,
    75  		chainID,
    76  		addrs,
    77  		ids.ShortEmpty,
    78  		ids.Empty,
    79  		int(maxPageSize),
    80  	)
    81  	if err != nil {
    82  		return nil, fmt.Errorf("problem retrieving atomic UTXOs: %w", err)
    83  	}
    84  	for _, utxo := range atomicUTXOs {
    85  		if utxo.InputID() == utxoID {
    86  			return utxo, nil
    87  		}
    88  	}
    89  	return nil, database.ErrNotFound
    90  }
    91  
    92  type walletUTXOsAdapter struct {
    93  	utxos *utxos
    94  	addrs set.Set[ids.ShortID]
    95  }
    96  
    97  func (w *walletUTXOsAdapter) UTXOs(_ context.Context, sourceChainID ids.ID) ([]*avax.UTXO, error) {
    98  	return w.utxos.UTXOs(w.addrs, sourceChainID)
    99  }
   100  
   101  func (w *walletUTXOsAdapter) GetUTXO(_ context.Context, chainID, utxoID ids.ID) (*avax.UTXO, error) {
   102  	return w.utxos.GetUTXO(w.addrs, chainID, utxoID)
   103  }