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 }