mirror of
https://github.com/luxfi/node.git
synced 2026-10-30 15:24:05 +00:00
104 lines
2.3 KiB
Go
104 lines
2.3 KiB
Go
// Copyright (C) 2019-2025, Lux Industries Inc. All rights reserved.
|
|
// See the file LICENSE for licensing terms.
|
|
|
|
package txstest
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/luxfi/database"
|
|
"github.com/luxfi/ids"
|
|
"github.com/luxfi/math/set"
|
|
"github.com/luxfi/node/vms/xvm/state"
|
|
"github.com/luxfi/node/wallet/chain/x/builder"
|
|
"github.com/luxfi/node/wallet/chain/x/signer"
|
|
lux "github.com/luxfi/utxo"
|
|
"github.com/luxfi/vm/chains/atomic"
|
|
)
|
|
|
|
const maxPageSize uint64 = 1024
|
|
|
|
var (
|
|
_ builder.Backend = (*walletUTXOsAdapter)(nil)
|
|
_ signer.Backend = (*walletUTXOsAdapter)(nil)
|
|
)
|
|
|
|
func newUTXOs(
|
|
ctx context.Context,
|
|
state state.State,
|
|
sharedMemory atomic.SharedMemory,
|
|
) *utxos {
|
|
// Use empty chain ID - caller should set this if needed
|
|
chainID := ids.Empty
|
|
return &utxos{
|
|
xchainID: chainID,
|
|
state: state,
|
|
sharedMemory: sharedMemory,
|
|
}
|
|
}
|
|
|
|
// SetChainID updates the chain ID for UTXO lookups
|
|
func (u *utxos) SetChainID(chainID ids.ID) {
|
|
u.xchainID = chainID
|
|
}
|
|
|
|
type utxos struct {
|
|
xchainID ids.ID
|
|
state state.State
|
|
sharedMemory atomic.SharedMemory
|
|
}
|
|
|
|
func (u *utxos) UTXOs(addrs set.Set[ids.ShortID], sourceChainID ids.ID) ([]*lux.UTXO, error) {
|
|
if sourceChainID == u.xchainID {
|
|
return lux.GetAllUTXOs(u.state, addrs)
|
|
}
|
|
|
|
atomicUTXOs, _, _, err := lux.GetAtomicUTXOs(
|
|
u.sharedMemory,
|
|
sourceChainID,
|
|
addrs,
|
|
ids.ShortEmpty,
|
|
ids.Empty,
|
|
int(maxPageSize),
|
|
)
|
|
return atomicUTXOs, err
|
|
}
|
|
|
|
func (u *utxos) GetUTXO(addrs set.Set[ids.ShortID], chainID, utxoID ids.ID) (*lux.UTXO, error) {
|
|
if chainID == u.xchainID {
|
|
return u.state.GetUTXO(utxoID)
|
|
}
|
|
|
|
atomicUTXOs, _, _, err := lux.GetAtomicUTXOs(
|
|
u.sharedMemory,
|
|
chainID,
|
|
addrs,
|
|
ids.ShortEmpty,
|
|
ids.Empty,
|
|
int(maxPageSize),
|
|
)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("problem retrieving atomic UTXOs: %w", err)
|
|
}
|
|
for _, utxo := range atomicUTXOs {
|
|
if utxo.InputID() == utxoID {
|
|
return utxo, nil
|
|
}
|
|
}
|
|
return nil, database.ErrNotFound
|
|
}
|
|
|
|
type walletUTXOsAdapter struct {
|
|
utxos *utxos
|
|
addrs set.Set[ids.ShortID]
|
|
}
|
|
|
|
func (w *walletUTXOsAdapter) UTXOs(_ context.Context, sourceChainID ids.ID) ([]*lux.UTXO, error) {
|
|
return w.utxos.UTXOs(w.addrs, sourceChainID)
|
|
}
|
|
|
|
func (w *walletUTXOsAdapter) GetUTXO(_ context.Context, chainID, utxoID ids.ID) (*lux.UTXO, error) {
|
|
return w.utxos.GetUTXO(w.addrs, chainID, utxoID)
|
|
}
|