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 }